При разработке учетных задач для бухгалтерии нередко возникает потребность свести в одну результирующую таблицу показатели, которые в стандартной конфигурации формируются в разных отчетах — например, в отчетах Анализ счета и Анализ счета по субконто. Разберем, можно ли решить эту задачу путем программного управления существующими экранными формами и как правильно извлекать учетные данные средствами встроенного языка 1С 7.7.
Попытка передать параметры через метод ОткрытьФорму и программно «нажать» кнопки в стандартном отчете сталкивается с архитектурными ограничениями платформы 1С 7.7:
ПриОткрытии() стандартных отчетов конфигурации не содержит логики обработки входящих параметров из Форма.Параметр с последующим автоматическим формированием и закрытием.Поэтому правильным и надежным путем является создание собственной внешней обработки или отчета, который напрямую запрашивает нужные показатели из базы данных.
Все типовые бухгалтерские отчеты платформы 1С 7.7 строятся на базе универсального объекта БухгалтерскиеИтоги. Вместо перехвата готовых печатных форм обратимся к итогам напрямую. Это обеспечивает максимальное быстродействие, исключает лишние экранные формы и позволяет получить точные цифры за заданный период.
Разберем по шагам алгоритм получения оборотов между счетами 90 («Продажи») и 41.1 («Товары на складах»), а также детализации по конкретному субсчету и субконто.
БухгалтерскиеИтоги через функцию СоздатьОбъект().ИспользоватьСубконто() до выполнения запроса.ВыполнитьЗапрос() с указанием периода, основного счета и счета корреспонденции.ДО(), КО() или осуществляем обход дерева итогов.Посмотрим на пример процедуры, которая рассчитывает требуемые показатели и сводит их в единую таблицу значений:
Процедура СформироватьСводныйОтчет()
Перем БИ, ТЗ;
Перем Счет90, Счет41_1, Счет90_2_1;
Счет90 = СчетПоКоду("90");
Счет41_1 = СчетПоКоду("41.1");
Счет90_2_1 = СчетПоКоду("90.2.1");
// Создаем результирующую таблицу для вывода пользователю
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Показатель", "Строка");
ТЗ.НоваяКолонка("Сумма", "Число", 15, 2);
// Шаг 1: Получаем оборот Дт 90 - Кт 41.1 (общий анализ счета)
БИ = СоздатьОбъект("БухгалтерскиеИтоги");
БИ.ВыполнитьЗапрос(ВыбДатаНач, ВыбДатаКон, Счет90, Счет41_1, , 3, , "С");
ТЗ.НоваяСтрока();
ТЗ.Показатель = "Оборот Дт 90 - Кт 41.1 (Всего)";
ТЗ.Сумма = БИ.ДО();
// Шаг 2: Получаем оборот Дт 90.2.1 - Кт 41.1 с детализацией по субконто
БИ2 = СоздатьОбъект("БухгалтерскиеИтоги");
// Если требуется отбор по конкретному субконто:
Если ПустоеЗначение(ВыбСубконто) = 0 Тогда
БИ2.ИспользоватьСубконто(ВидыСубконто.Номенклатура, ВыбСубконто, 2);
КонецЕсли;
БИ2.ВыполнитьЗапрос(ВыбДатаНач, ВыбДатаКон, Счет90_2_1, Счет41_1, , 3, , "С");
ТЗ.НоваяСтрока();
ТЗ.Показатель = "Оборот Дт 90.2.1 - Кт 41.1 (Себестоимость без НДС)";
ТЗ.Сумма = БИ2.ДО();
// Выводим полученную таблицу значений в форму или отчет
ТЗ.ВыбратьСтроку();
КонецПроцедуры
Проанализируем плюсы такого подхода по сравнению с вызовом стандартных отчетов:
.ert) работает без изменения конфигурации и не создает проблем при последующих обновлениях типовой 1С:Бухгалтерии 7.7.