В процессе разработки или интеграции в конфигурации 1С:Бухгалтерия предприятия 3.0 программисты часто сталкиваются с необходимостью автоматического заполнения счетов учета (расчетов с контрагентами или учета номенклатуры). Если раньше для этих целей использовались прямые методы в модулях объектов документов, такие как ЗаполнитьСчетаУчетаРасчетов(), то в современных версиях архитектура изменилась. Старые методы помечены как устаревшие, и система ожидает использования новых механизмов подсистемы СчетаУчетаВДокументах.
В данной статье мы подробно разберем, как правильно инициализировать заполнение счетов программно, какие флаги нужно устанавливать в дополнительных свойствах объекта и как принудительно вызвать механизмы определения счетов до записи документа.
Ранее логика определения счетов находилась внутри кода каждого конкретного документа (Реализация товаров услуг, Поступление товаров услуг и т.д.). В новых редакциях БП 3.0 логика вынесена в общие модули. Это сделано для унификации: теперь счета определяются на основании регистра сведений Счета учета расчетов с контрагентами или Счета учета номенклатуры по единому алгоритму для всей системы.
Основным инструментом управления этим процессом стал общий модуль СчетаУчетаВДокументах. Рассмотрим основные способы работы с ним.
Это самый простой и рекомендуемый способ, если вы создаете документ программно и планируете его записывать. Мы передаем системе сигнал о том, что при выполнении стандартных обработчиков события ПередЗаписью необходимо выполнить процедуру заполнения счетов.
Для этого в структуру ДополнительныеСвойства объекта документа нужно вставить специальный ключ. Рассмотрим пример кода:
// Создаем новый документ реализации
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7700000000");
НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Поставщик");
НовыйДокумент.ДоговорКонтрагента = НовыйДокумент.Контрагент.ОсновнойДоговор;
// Устанавливаем флаг для автоматического заполнения счетов перед записью
НовыйДокумент.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчетаПередЗаписью", Истина);
// При записи система сама определит счета 62.01, 62.02 и счета в табличной части
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
Важный нюанс: если вы загружаете данные в режиме ОбменДанными.Загрузка = Истина, стандартные обработчики событий могут не сработать. В этом случае установка флага в ДополнительныеСвойства является критически важной, так как механизмы БП 3.0 анализируют этот флаг даже в режиме загрузки для корректного формирования проводок.
Иногда требуется увидеть заполненные счета в объекте еще до того, как будет вызвана процедура записи (например, для вывода на экран или выполнения дополнительных проверок). В этом случае мы можем вызвать методы общего модуля напрямую.
Проанализируем пример использования метода ЗаполнитьПередЗаписью:
// Подготовка объекта (заполнение организации, контрагента и договора)
// ...
// Принудительный вызов заполнения счетов
СчетаУчетаВДокументах.ЗаполнитьПередЗаписью(Объект, РежимЗаписиДокумента.Запись);
// Если нужно перезаполнить счета, даже если они уже заполнены
Объект.ДополнительныеСвойства.Вставить("ПерезаполнитьСчетаУчета", Истина);
СчетаУчетаВДокументах.Заполнить(Объект);
Метод СчетаУчетаВДокументах.Заполнить(Объект) является универсальным. Он анализирует метаданные переданного объекта, находит реквизиты счетов расчетов в шапке и счета учета в табличных частях, после чего заполняет их значениями по умолчанию.
Если ваша задача ограничена только заполнением счетов учета номенклатуры (например, счета 41.01, 90.01.1, 90.03) в табличной части Товары, можно использовать специализированный метод:
// Заполняем только табличную часть "Товары"
СчетаУчетаВДокументах.ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, "Товары");
// Аналогично для услуг
СчетаУчетаВДокументах.ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, "Услуги");
Этот подход полезен, когда вы программно добавляете строки в существующий документ и не хотите перезаполнять счета расчетов с контрагентом в шапке, чтобы не сбросить ручные правки пользователя.
В редких случаях, когда стандартная логика СчетаУчетаВДокументах.Заполнить не подходит (например, вы создаете сложную обработку анализа данных без создания документов), можно обратиться к методам получения значений из регистров напрямую. Выясним, как это сделать через модуль БухгалтерскийУчетПереопределяемый или СчетаУчетаРасчетов.
// Получаем счета расчетов программно в структуру
СчетаРасчетов = БухгалтерскийУчетПереопределяемый.ПолучитьСчетаРасчетовСКонтрагентом(
Объект.Организация,
Объект.Контрагент,
Объект.ДоговорКонтрагента
);
// Теперь можно обратиться к результату
СчетУчетаРасчетов = СчетаРасчетов.СчетРасчетов; // Например, 60.01
СчетАвансов = СчетаРасчетов.СчетАвансов; // Например, 60.02
Рассмотрим ситуации, в которых счета могут остаться пустыми даже после вызова указанных выше методов:
Организация, Дата (счета могут зависеть от периода), Контрагент и ДоговорКонтрагента. Если договор не соответствует виду операции документа, счета не будут найдены.ЗаполнитьПередЗаписью, а потом меняете Контрагента в объекте, счета останутся от старого контрагента. Соблюдайте последовательность: Сначала данные — затем заполнение счетов.Подводя итог, наиболее надежным и современным способом для программиста в БП 3.0 является использование флага ЗаполнитьСчетаУчетаПередЗаписью в ДополнительныеСвойства. Это гарантирует, что система применит все актуальные правила учета, предусмотренные типовой конфигурацией, и избавит вас от необходимости вручную прописывать счета 60, 62 или 90 в коде. Для поиска и изучения других типовых процедур и функций конфигурации можно использовать справочник методов Бухгалтерии предприятия 3.0.