При автоматизации учета и переносе данных из внешних систем часто возникает задача программного создания документов в 1С. Разработчики, привыкшие к архитектуре старых конфигураций (например, ЗУП 2.5 или УПП 1.3), могут столкнуться с крайне странным поведением системы в современных конфигурациях на платформе 1С:Предприятие 8.3 (ЗУП 3.1, ERP 2.5, Комплексная автоматизация 2.5).
Типичный сценарий: вы программно создаете документ СправкаНДФЛ (Справка о доходах (2-НДФЛ) для сотрудников), заполняете табличные части Сотрудники и СведенияОДоходах, успешно записываете объект с помощью метода Записать(РежимЗаписиДокумента.Запись). В этот момент все выглядит отлично, документ создается, данные в памяти есть. Однако при первой же попытке открыть сохраненный документ в пользовательском режиме или посмотреть его в отладчике в событии ПриСозданииНаСервере табличная часть СведенияОДоходах оказывается абсолютно пустой. Выясним причину этой проблемы и разберем по шагам, как ее правильно решить.
В современных конфигурациях 1С разработчики фирмы "1С" применили оптимизацию хранения данных в СУБД. Табличные части документов, которые потенциально могут содержать огромные объемы информации (например, детальная расшифровка доходов по месяцам и кодам для каждого сотрудника), физически не хранятся в табличных частях самого документа.
Вместо этого в системе реализована следующая схема:
СправкаНДФЛ это регистры сведений СведенияОДоходахДляСправокНДФЛ и СведенияОВычетахДляСправокНДФЛ.ПередЗаписьюНаСервере или ПриЗаписиНаСервере). Именно этот код берет данные из экранных табличных частей формы и записывает их в соответствующие регистры сведений. При программном вызове метода ДокументОбъект.Записать() код формы не выполняется, логика переноса игнорируется, и вспомогательные регистры остаются пустыми.Существует два принципиально разных способа решения этой проблемы. Рассмотрим подробно каждый из них.
---
Это наиболее правильный и архитектурно верный путь в рамках концепции ЗУП 3.1. Вместо того чтобы пытаться вручную собрать и записать отчетный документ 2-НДФЛ, нам нужно перенести все первичные данные о доходах во вспомогательный документ ОперацияНалоговогоУчетаПоНДФЛ.
При проведении этот документ сделает все необходимые движения по ключевым регистрам накопления НДФЛ (таким как УчетДоходовДляИсчисленияНДФЛ, РасчетыНалогоплательщиковСБюджетомПоНДФЛ и др.). После этого стандартная справка 2-НДФЛ (для сотрудников или для ИФНС) сформируется и заполнится абсолютно корректно в стандартном автоматическом режиме — как интерактивно по кнопке "Заполнить", так и программно через вызов типового метода заполнения.
Проанализируем пример кода для программного создания документа ОперацияНалоговогоУчетаПоНДФЛ:
НоваяОперация = Документы.ОперацияНалоговогоУчетаПоНДФЛ.СоздатьДокумент();
НоваяОперация.Дата = ТекущаяДата();
НоваяОперация.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701000000");
НоваяОперация.Сотрудник = Справочники.Сотрудники.НайтиПоКоду("00001");
НоваяОперация.НалоговыйПериод = Год(ТекущаяДата());
// Заполняем доходы по месяцам
НоваяСтрокаДоходов = НоваяОперация.Доходы.Добавить();
НоваяСтрокаДоходов.ДатаПолученияДохода = Дата(2023, 10, 15);
НоваяСтрокаДоходов.КодДохода = Справочники.КодыДоходовНДФЛ.НайтиПоКоду("2000");
НоваяСтрокаДоходов.СуммаДохода = 50000;
НоваяСтрокаДоходов.КатегорияДохода = Перечисления.КатегорииДоходовНДФЛ.ОплатаТруда;
// Записываем и проводим документ
НоваяОперация.Записать(РежимЗаписиДокумента.Проведение);
После проведения такого документа все данные о доходах сотрудника попадут в контур учета НДФЛ. Теперь, если мы создадим документ СправкаНДФЛ и вызовем стандартную процедуру заполнения, она автоматически подтянет эти данные.
---
Если перед вами стоит задача загрузить строго определенные данные в саму справку 2-НДФЛ в обход регистров расчета (например, при переносе "мертвых" исторических данных для печатных форм), вам придется программно эмулировать поведение формы документа. То есть — самостоятельно записать движения в регистры сведений, связанные со справкой.
Разберем по шагам, как это реализовать:
СправкаНДФЛ в режиме записи (без проведения), чтобы получить его уникальную ссылку.СведенияОДоходахДляСправокНДФЛ и при необходимости СведенияОВычетахДляСправокНДФЛ.Рассмотрим пример программной реализации этого алгоритма:
// Шаг 1. Создание и запись документа СправкаНДФЛ
ДокОбъект = Документы.СправкаНДФЛ.СоздатьДокумент();
ДокОбъект.Дата = ТекущаяДата();
ДокОбъект.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701000000");
ДокОбъект.НалоговыйПериод = 2023;
ДокОбъект.ТипСправки = Перечисления.ТипыСправокНДФЛ.ДляСотрудника;
// Обязательно заполняем ТЧ Сотрудники (она хранится в самом документе)
НовыйСотрудник = ДокОбъект.Сотрудники.Добавить();
НовыйСотрудник.Сотрудник = Справочники.Sотрудники.НайтиПоКоду("00001");
НовыйСотрудник.ФиксСтрока = Истина; // Пометка ручной корректировки
// Записываем документ, чтобы получить ссылку
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
СсылкаНаДокумент = ДокОбъект.Ссылка;
// Шаг 2. Заполнение регистра сведений "Сведения о доходах для справок НДФЛ"
НаборДоходов = РегистрыСведений.СведенияОДоходахДляСправокНДФЛ.СоздатьНаборЗаписей();
НаборДоходов.Отбор.Справка.Установить(СсылкаНаДокумент);
// Создаем новую запись в регистре
НоваяЗапись = НаборДоходов.Добавить();
НоваяЗапись.Справка = СсылкаНаДокумент;
НоваяЗапись.Сотрудник = НовыйСотрудник.Сотрудник;
НоваяЗапись.МесяцНалоговогоПериода = Дата(2023, 10, 01);
НоваяЗапись.КодДохода = Справочники.КодыДоходовНДФЛ.НайтиПоКоду("2000");
НоваяЗапись.СуммаДохода = 50000;
НоваяЗапись.Ставка = Перечисления.НДФЛСтавки.Ставка13;
// Записываем набор записей в базу данных
НаборДоходов.Записать();
После выполнения данного кода, при открытии непроведенного документа в пользовательском интерфейсе, платформа обратится к регистру СведенияОДоходахДляСправокНДФЛ, успешно считает записанные нами данные по отбору Справка и корректно отобразит их в табличной части на форме.
Пропадание данных в табличных частях при программной работе с документами НДФЛ в ЗУП 3.1 — это не баг платформы, а следствие оптимизации архитектуры конфигурации. Понимание того, где физически хранятся данные (в реквизитах самого объекта или в подчиненных регистрах), позволяет избежать подобных трудностей. Для ведения полноценного учета всегда старайтесь использовать первый способ (через документ "Операция налогового учета по НДФЛ"), а для технических манипуляций и переноса исторических справок — второй способ с прямой записью в регистры сведений.