• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Отчет по кредиту 51го счета

  • Автор темы ge4r
  • Дата начала
G

ge4r

Задача следующая:
есть отчет "Обороты счета",там задаем период,номер счета(51)...выводится "обороты по счету 51",тыкаем на расшифровку ячейки 51 го счета,выводится "журнал проводок по 51 счету"...опять же тыкаем на расшифровку,получаем "операция(Выписка)"
вот отсюда мне нужно выудить вид договора,контрагента,сумму,дату и тд...
какие нужно использовать функции\процедуры,и как узнать идентификаторы ячеек этой операции?
если непонятно объясняю,могу сделать скрины иль базу скинуть
 
K

KiR

ну ты к примеру можешь получить все операции в которых фигурирует указанный счет за определенный период, а потом уже перебирать каждую и получать оттуда данные
 
T

thinkfast

как узнать идентификаторы ячеек этой операции?
Правой кнопкой по ячейке "Свойства" - узнаешь имя ячейки, но лучше знать имя области.
Смотри Запрос который формирует "отчет Выписка", поидее он выбирает все необходимые значения
Далее обработкой легко выберешь то, что тебе надо.
 
K

KiR

thinkfast, кстати тоже хороший вариант предложил!
 
G

ge4r

пытаюсь делать с помощью ВыбратьДокументы

Код:
Процедура Сформировать() 
Перем Опер;
Проверить_Дату();
Опер = СоздатьОбъект("Операция"); 
Опер.ВыбратьДокументы(НачДата,КонДата);

как далее выбрать те документы где фигурирует кредит 51го?
я так понимаю цикл Пока Опер.ПолучитьДокументы()<>0 цикл... а вот что в цикле?
 
V

vbs

Используй как внешний цикл ВыбратьОперацииСпроводками, а как внутренний - перебор проводок (Пока Операция.ПолучитьПроводку)
 
G

ge4r

Код:
Процедура Сформировать() 
Перем Опер, Таб;
Проверить_Дату();
Таб = СоздатьОбъект("Таблица");
Таб.ВывестиСекцию ("Шапка");
Опер = СоздатьОбъект("Операция"); 
Опер.ВыбрратьОперацииСПроводками (НачДата,КонДата,"*,51",,,);
Пока Опер.ПолучитьПроводку() = 1 Цикл
Таб.ВывестиСекцию("Строка");  
КонецЦикла;
КонецПроцедуры

тоесть вот так получается? но что указывать в таблице,как выковырить идентификаторы из этих проводок?
 
V

vbs

через соответствующие субконто

Но только чуть не так :
Опер.ВыбратьОперацииСПроводками (НачДата,КонДата,"*,51",,,);
Пока Опер.ПолучитьОперацию() = 1 Цикл
Опер.ВыбратьПроводки();
Пока Опер.ПолучитьПроводку() = 1 Цикл
С1 = Опер.Субконто(1);
С2 = Опер.Субконто(2);
Таб.ВывестиСекцию("Строка");
КонецЦикла;
КонецЦикла;
// примерно так - синтаксис уточни сам
 
G

ge4r

понял,то есть в С1 и С2 мы вытащили договор,и подраздел договора...а остальное? пробывал субконто(3-5) ,нет таких
 
V

vbs

У каждого счета столько видов субконто (точнее, не более максимального), сколько предусмотрено конфигурацией (см. план счетов).
И ЕЩЕ УТОЧНЕНИЕ
Правильно так :
Д1 = Опер.Д*цензура*.Субконто(1);
К1 = Опер.Кредит.Субконто(1);
Соответственно, Д1 и К1 будут иметь тот же тип, что и вид Субконто1
В общем, в ЖКК или синтакс-помощник загляни
 
U

unknown181538

И, наверное, лучше через бухгалтерский запрос с периодом "проводка" в плане производительности...
 
G

ge4r

Вот что написал

Код:
Процедура Сформировать() 
Перем Опер, Таб, Сумма, Заголовок;
Проверить_Дату(); 
Заголовок = "Отчет по движению денежных средств за период "+ ПериодСтр(НачДата,КонДата);
Таб = СоздатьОбъект("Таблица");
Таб.ВывестиСекцию ("Шапка");


Док = СоздатьОбъект("Документ.Выписка");
Док.ВыбратьДокументы(НачДата, КонДата);
Пока Док.ПолучитьДокумент() = 1 Цикл
Если Док.Проведен() = 0 Тогда
Продолжить;
КонецЕсли;
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
Если Док.Расход <> 0 Тогда
Если ПустоеЗначение(Док.ПервичныйДокумент) = 0 Тогда
ВидДоговора = Док.ПервичныйДокумент.Договор.ВидДоговора;
Если Док.КоррСчет.ПринадлежитГруппе(СчетПоКоду("68")) = 1 Тогда	
Контрагент = Док.Наименование(СчетПоКоду("68"));
ИначеЕсли Док.КоррСчет.ПринадлежитГруппе(СчетПоКоду("69")) = 1 Тогда 
Контрагент = Док.ПервичныйДокумент.Договор;
Иначе
Контрагент = Док.ПервичныйДокумент.Контрагент;
КонецЕсли;


Договор = Док.ПервичныйДокумент.Договор;
Сумма = Док.Расход;
НомПП = Док.НомерДокВходящий;
ДатаПП = Док.ДатаДокВходящий;
ДатаВыписки = Док.ДатаДок;
Таб.ВывестиСекцию("Строка"); 
КонецЕсли;
КонецЕсли;
КонецЦикла;

КонецЦикла;

Таб.ТолькоПросмотр(1);
Таб.Опции(0,0,0,0);
Таб.ПараметрыСтраницы(2,,,,,,,,,1);	
Таб.Показать(); 
КонецПроцедуры

Теперь нужно сделать отбор по контрагенту и виду договора
как это лучше реализовать,у меня только вариант с кучей Если...есть ли более рациональный способ?

и еще,если в группе встречается 68 счет,то в поле контрагент нужно вывести наименование счета,подскажите функцию,которая возвращает наименование...
Если Док.КоррСчет.ПринадлежитГруппе(СчетПоКоду("68")) = 1 Тогда
 
V

vbs

А просто ОСВ по счету 51 чем не устраивает ?
Если не совсем - проще ее доработать

и еще,если в группе встречается 68 счет,то в поле контрагент нужно вывести наименование счета,подскажите функцию,которая возвращает наименование
У счета есть атрибут "Наименование"
 
G

ge4r

ну вот,как бы отчет выглядит так
Код:
Процедура Проверить_Дату() //Проверка заданного периода
Если НачДата>КонДата Тогда 
Предупреждение("Неправильно задан период формирования отчета!"+РазделительСтрок+
"Дата начала больше даты окончания периода.");
КонецЕсли; 
КонецПроцедуры

Процедура Сформировать() 
Перем Опер, Таб, Сумма, Заголовок;
Проверить_Дату(); 
Заголовок = "Отчет по движению денежных средств за период "+ ПериодСтр(НачДата,КонДата);
Таб = СоздатьОбъект("Таблица");
Таб.ВывестиСекцию ("Шапка");


Док = СоздатьОбъект("Документ.Выписка");
Док.ВыбратьДокументы(НачДата, КонДата);
Пока Док.ПолучитьДокумент() = 1 Цикл
Если Док.Проведен() = 0 Тогда
Продолжить;
КонецЕсли;
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
Если Док.Расход <> 0 Тогда
Если ПустоеЗначение(Док.ПервичныйДокумент) = 0 Тогда
ВидДоговора = Док.ПервичныйДокумент.Договор.ВидДоговора;
Если Док.КоррСчет.ПринадлежитГруппе(СчетПоКоду("68")) = 1 Тогда	
Контрагент = Док.ПервичныйДокумент.Договор;
ИначеЕсли Док.КоррСчет.ПринадлежитГруппе(СчетПоКоду("69")) = 1 Тогда 
Контрагент = СчетПоКоду("69").Наименование;
Иначе
Контрагент = Док.ПервичныйДокумент.Контрагент;
КонецЕсли;

Если ((ВыбКонтрагент = Контрагент) и (ВыбВидДоговора = ВидДоговора)) или ((ВыбКонтрагент = Контрагент) и (ВыбВидДоговора.Выбран()=0))
или ((ВыбКонтрагент.Выбран()=0) и (ВыбВидДоговора=ВидДоговора)) или ((ВыбКонтрагент.Выбран()=0) и (ВыбВидДоговора.Выбран()=0)) Тогда
Договор = Док.ПервичныйДокумент.Договор;
Сумма = Док.Расход;
НомПП = Док.НомерДокВходящий;
ДатаПП = Док.ДатаДокВходящий;
ДатаВыписки = Док.ДатаДок;
Таб.ВывестиСекцию("Строка"); 
КонецЕсли; 

КонецЕсли;
КонецЕсли;
КонецЦикла;

КонецЦикла;

Таб.ТолькоПросмотр(1);
Таб.Опции(0,0,0,0);
Таб.ПараметрыСтраницы(2,,,,,,,,,1);	
Таб.Показать(); 
КонецПроцедуры

с удовольствием выслушаю критику)
 
G

ge4r

подскажите,как сделать разделитель разрядов в таблице отчета? то есть чтобы выводилось 12 145.12 а не 12145.12
 
T

thinkfast

Формат("Твое число", "ЧГ=3,0");

Пример:
Область.Параметры.СуммаНДС = Формат(текСтрока.СуммаНДС, "ЧГ=3,0");

З.Ы. если число передается строкой, эффекта не будет.

Придется так :
Область.Параметры.СуммаНДС = Формат(Число(текСтрока.СуммаНДС), "ЧГ=3,0");
 
G

ge4r

все оказалось проще, в ячейке послевыражения и #N15.2 просто добавил ". " где 1ый символ разделитель целой и дробной части,а второй разделитель разрядов

У меня еще вопрос...как можно отсортировать таблицу отчета по столбцу? с таблицей значений все ясно таб.Сортировать("ВидДДС+"), а вот про таблицу отчета чтот вообще нигде ничего не могу найти...
 
V

vbs

с удовольствием выслушаю критику
Сам справился и работает - уже хорошо. Но как-то перебор документов для получения оборотов по бухитогам смотрится вяленько.
В смысле оптимального и быстрого кода, разумеется. Теперь осваивай работу с объектом "БухгалтерскиеИтоги"
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!