При интеграции 1С:Бухгалтерии 3.0 со сторонними учетными системами, CRM или платежными шлюзами разработчики часто сталкиваются с задачей пакетного импорта проводок. Возникает закономерное желание минимизировать количество создаваемых документов в базе и загружать все поступившие за день проводки в один-единственный документ ОперацияБух (Операция, введенная вручную), даже если сами хозяйственные операции совершались в разные дни.
Рассмотрим, как устроена работа регистра бухгалтерии в типовой конфигурации «Бухгалтерия предприятия 3.0», почему попытка объединить проводки за разные даты в один документ несет критические риски и какие существуют правильные архитектурные решения.
Проанализируем техническую сторону работы с регистратором и набором записей:
РегистрБухгалтерииНаборЗаписей допускает, чтобы значение поля Период в строке записи не совпадало с реквизитом Регистратор.Дата. Программно можно сформировать набор записей с любыми датами.Период в таблице проводок документа ОперацияБух скрыта от пользователя. При открытии и последующей интерактивной записи документа встроенные серверные процедуры принудительно перезаписывают реквизит Период во всех строках движений значением даты шапки документа. Если бухгалтер случайно откроет такой документ и нажмет кнопку «Записать», все ранее загруженные даты в проводках моментально схлопнутся в одну дату шапки.Период каждой записи. Если в документе с открытой текущей датой окажется хотя бы одна проводка за закрытый период, программа заблокирует сохранение и проведение документа целиком.Хозрасчетный. Он не делает записей в регистры расчетов с контрагентами, учета НДС, регистры УСН и налога на прибыль. Использование ручных операций для загрузки массовых хозяйственных фактов нередко лишает базу целостности учета.Выясним, к каким учетным ошибкам приводит расхождение между датой документа и датами его записей:
Период проводки. При расшифровке строки отчета за определенное число пользователь проваливается в документ, в шапке которого указана совсем другая дата. Это вызывает путаницу у бухгалтеров и аудиторов.Разберем эталонный подход, не нарушающий архитектуру типовой конфигурации. Вместо создания единого документа за сеанс загрузки входящую таблицу проводок необходимо предварительно сгруппировать по фактической дате совершения операции. В результате алгоритм обмена создаст ровно столько документов ОперацияБух, сколько уникальных дат присутствует во входящем пакете, при этом дата каждого документа будет строго совпадать с датой его проводок.
Посмотрим на пример программной группировки и создания документов:
// ТаблицаВходящихДанных содержит колонки: ДатаОперации, СчетДт, СчетКт, Сумма
ТаблицаДат = ТаблицаВходящихДанных.Скопировать();
ТаблицаДат.Свернуть("ДатаОперации");
Для Каждого СтрДата Из ТаблицаДат Цикл
ОтборПоДате = Новый Структура("ДатаОперации", СтрДата.ДатаОперации);
СтрокиТекущегоДня = ТаблицаВходящихДанных.НайтиСтроки(ОтборПоДате);
ДокументОперация = Документы.ОперацияБух.СоздатьДокумент();
ДокументОперация.Дата = СтрДата.ДатаОперации;
ДокументОперация.Организация = ОрганизацияПоУмолчанию;
ДокументОперация.Содержание = "Загрузка операций за " + Формат(СтрДата.ДатаОперации, "ДФ=dd.MM.yyyy");
ДокументОперация.Записать();
// Заполняем набор записей
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументОперация.Ссылка);
Для Каждого СтрДанных Из СтрокиТекущегоДня Цикл
Проводка = НаборЗаписей.Добавить();
Проводка.Период = СтрДата.ДатаОперации;
Проводка.Регистратор = ДокументОперация.Ссылка;
Проводка.Организация = ОрганизацияПоУмолчанию;
Проводка.СчетДт = СтрДанных.СчетДт;
Проводка.СчетКт = СтрДанных.СчетКт;
Проводка.Сумма = СтрДанных.Сумма;
КонецЦикла;
НаборЗаписей.Записать();
КонецЦикла;
При таком подходе документы прозрачно ложатся в журнал, не ломают регламентные операции и корректно открываются пользователями для просмотра и редактирования без риска порчи периодов проводок.
Если требования проекта категорически запрещают создавать несколько документов на каждую дату, существует обходной технический путь. Запись проводок с произвольными датами возможна через прямое обращение к набору записей с активацией режима загрузки данных.
Разберем по шагам, как это реализовать:
ОперацияБух текущей датой загрузки.РегистрБухгалтерииНаборЗаписей.Хозрасчетный с отбором по новому регистратору.ОбменДанными.Загрузка = Истина. Это отключает типовые проверки модуля набора записей и механизмы автозаполнения периода.Период каждой записи нужную дату операции.Посмотрим на пример кода:
ДокументОперация = Документы.ОперацияБух.СоздатьДокумент();
ДокументОперация.Дата = ТекущаяДата();
ДокументОперация.Организация = ОрганизацияПоУмолчанию;
ДокументОперация.Содержание = "Сводная загрузка операций";
ДокументОперация.ОбменДанными.Загрузка = Истина;
ДокументОперация.Записать();
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументОперация.Ссылка);
НаборЗаписей.ОбменДанными.Загрузка = Истина;
Для Каждого СтрДанных Из ТаблицаВходящихДанных Цикл
Проводка = НаборЗаписей.Добавить();
Проводка.Период = СтрДанных.ДатаОперации; // Устанавливаем произвольную дату
Проводка.Регистратор = ДокументОперация.Ссылка;
Проводка.Организация = ОрганизацияПоУмолчанию;
Проводка.СчетДт = СтрДанных.СчетДт;
Проводка.СчетКт = СтрДанных.СчетКт;
Проводка.Сумма = СтрДанных.Сумма;
КонецЦикла;
НаборЗаписей.Записать();
Важное предупреждение: При использовании этого варианта необходимо обязательно защитить документ от интерактивного изменения. С помощью расширения конфигурации следует либо сделать форму документа доступной только для чтения (свойство ТолькоПросмотр = Истина), либо вынести колонку Период на форму и переопределить логику в обработчике ПередЗаписьюНаСервере, чтобы форма не подменяла периоды строк датой документа.
Проанализируем природу загружаемых данных. Часто под видом «разнородных проводок» скрываются типовые операции: банковские выписки, отчеты эквайринга или розничные продажи. Если загружать их специализированными документами (Поступление на расчетный счет, Операция по платежной карте, Отчет о розничных продажах), система автоматически сформирует корректные движения не только по регистру Хозрасчетный, но и по регистрам специальных налоговых подсистем, исключая любые методологические ошибки.