При работе с конфигурациями 1С, такими как 1С:Комплексная автоматизация (КА) или 1С:Зарплата и Управление Персоналом (ЗУП), мы часто сталкиваемся с необходимостью автоматизировать заполнение различных форм отчетности. Одна из таких форм — документ СведенияОСтраховомСтажеЗастрахованныхЛицСЗВ_СТАЖ, который с 2023 года стал частью подраздела 1.2 формы ЕФС-1. В этом документе есть реквизит РабочееМесто — текстовое поле, которое может потребоваться заполнять программно, особенно в версиях ПРОФ, где такое заполнение не всегда автоматизировано в отличие от версий КОРП.
Рассмотрим распространенную ситуацию: вы программно заполняете поле РабочееМесто в табличной части документа, визуально видите изменения на форме, но при выгрузке данных в файл или закрытии документа без перепроведения, изменения не сохраняются. При этом, если внести данные вручную и затем провести документ, все сохраняется корректно. Выясним причину такого поведения и предложим надежное решение.
Основная сложность заключается в понимании того, как 1С обрабатывает данные, отображаемые на формах. В обсуждаемом документе реквизит ЗаписиОСтаже (который содержит колонку РабочееМесто) имеет тип ДанныеФормыКоллекция и, как было отмечено, не является реквизитом объекта документа. Это критически важный момент. Давайте разберем, что это означает:
ДанныеФормыКоллекция: Это временная коллекция данных, которая существует исключительно в контексте открытой формы. Она предназначена для отображения информации пользователю и для сбора вводимых им данных. Такие данные не сохраняются в базе данных автоматически при изменении на форме или при ее закрытии.
Не является реквизитом объекта: В отличие от реквизитов самого документа (например, Организация, Дата или табличные части, которые напрямую связаны с объектом в базе данных), данные типа ДанныеФормыКоллекция на форме не имеют прямого соответствия в структуре данных, хранящихся в базе. Они являются частью модели формы и могут быть рассчитаны при ее открытии на основе других данных или регистров.
Программное заполнение и сохранение: Когда мы программно изменяем значение в такой коллекции на форме, мы меняем только ее временное состояние. Если после этого мы просто закрываем форму или вызываем Записать() для документа без режима проведения, эти изменения не будут учтены, потому что механизм записи документа по умолчанию работает с его собственными реквизитами, а не с временными данными формы.
Ключ к решению проблемы кроется в процедуре проведения документа. В 1С, когда документ проводится, запускается специальный обработчик события ОбработкаПроведения (или похожие процедуры в модуле объекта документа). Именно в этом обработчике реализована логика, которая:
Считывает данные, введенные на форме, в том числе из коллекций типа ДанныеФормыКоллекция.
На основе этих данных формирует записи в регистрах сведений (например, РегистрСведений.ЗаписиОСтажеСведенияОСтраховомСтажеЗастрахованныхЛицСЗВ_СТАЖ), регистрах накопления или изменяет другие объекты базы данных.
Проверяет корректность введенных данных и выполняет другие необходимые действия, специфичные для проведения.
Таким образом, когда вы вводите данные вручную и затем перепроводите документ, система 1С использует данные из формы, обрабатывает их в ОбработкеПроведения и записывает в базу. Если же вы просто программно заполняете поле и не проводите документ, этот механизм не срабатывает, и данные остаются несохраненными.
Чтобы программно заполнить поле РабочееМесто и обеспечить его сохранение в базе данных, нам необходимо сделать следующее:
Получить объект документа: Сначала нам нужна ссылка на экземпляр документа, который мы хотим изменить.
Доступ к данным стажа: Хотя РабочееМесто не является прямым реквизитом объекта, документ СведенияОСтраховомСтажеЗастрахованныхЛицСЗВ_СТАЖ (или ЕФС-1: Сведения о страховом стаже застрахованных лиц, СЗВ-СТАЖ в современных версиях) имеет внутренние механизмы для хранения и обработки этих данных. Обычно это реализуется через одну из его табличных частей или временных структур, которые затем используются для формирования записей в регистры.
Нам потребуется найти соответствующую табличную часть объекта (например, ПериодыСтажа или подобную) и ее колонку, которая на форме соответствует полю РабочееМесто. В 1С часто бывает, что на форме отображается коллекция, которая при записи/проведении синхронизируется с определенной табличной частью объекта.
Заполнить поле РабочееМесто: Итерируя по строкам соответствующей табличной части, мы программно устанавливаем необходимое значение для поля РабочееМесто согласно вашей логике.
Провести документ: После внесения изменений в данные документа (или его временные структуры, которые он использует), мы должны вызвать метод Записать() с режимом проведения. Это запустит процедуру ОбработкаПроведения, которая возьмет обновленные данные и сохранит их в регистры.
Рассмотрим пример кода на встроенном языке 1С, который демонстрирует, как это можно реализовать. Мы будем работать с объектом документа, предполагая, что его табличная часть ПериодыСтажа (или аналогичная) содержит или может содержать колонку РабочееМесто, которая затем обрабатывается при проведении. Даже если РабочееМесто не является прямым реквизитом объекта, это наиболее распространенный паттерн, когда документ имеет внутренний механизм для таких данных, и проведение его обрабатывает.
// Предположим, у нас есть ссылка на документ, который необходимо обработать.
// Например, мы получили ее из списка документов или из обработки.
// Пример получения ссылки:
// ДокументСсылка = Документы.ЕФС1СведенияОСтраховомСтажеЗастрахованныхЛиц.НайтиПоНомеру("0000001");
// Или, если это новый документ:
// ДокументСсылка = Документы.ЕФС1СведенияОСтраховомСтажеЗастрахованныхЛиц.СоздатьДокумент().Ссылка;
// 1. Получаем объект документа по ссылке
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
// 2. Если документ еще не заполнен данными стажа, вызовем стандартный метод заполнения,
// чтобы получить актуальную структуру для обработки.
// Имя метода может отличаться в зависимости от версии конфигурации.
// Например, в КА 2.5/ЗУП это может быть ДокументОбъект.ЗаполнитьПоДаннымОСотрудниках()
// или ДокументОбъект.ЗаполнитьДанныеСтажа().
// Допустим, у документа есть метод, который готовит данные для табличной части стажа.
// Если документ уже содержит данные, этот шаг можно пропустить.
// ДокументОбъект.ЗаполнитьТабличнуюЧастьСтажа(); // Условный метод для примера
// 3. Обращаемся к табличной части документа, которая соответствует данным стажа.
// В данном случае, это может быть табличная часть "ПериодыСтажа",
// которая используется для формирования сведений о стаже.
// Важно: если колонки "РабочееМесто" в этой табличной части нет, возможно,
// ее необходимо добавить динамически или найти другую табличную часть/метод,
// который позволяет оперировать этим полем.
// Однако, чаще всего, если поле отображается на форме и обрабатывается при проведении,
// оно так или иначе присутствует в данных, которые обрабатывает объект.
Если ДокументОбъект.Метаданные().ТабличныеЧасти.Найти("ПериодыСтажа") <> Неопределено Тогда
ТабличнаяЧастьСтажа = ДокументОбъект.ПериодыСтажа;
// Проверяем наличие колонки "РабочееМесто" в табличной части объекта.
// Если ее нет, это означает, что "РабочееМесто" может быть обрабатываемым
// только через специфическую форму или внешний алгоритм при выгрузке.
// Но если оно сохраняется при проведении, то механизм проведения
// должен иметь доступ к этому полю.
// Если колонки нет, но она нужна:
// Если ТабличнаяЧастьСтажа.Колонки.Найти("РабочееМесто") = Неопределено Тогда
// ТабличнаяЧастьСтажа.Колонки.Добавить("РабочееМесто", Новый ОписаниеТипов("Строка"));
// КонецЕсли;
// 4. Итерируем по строкам табличной части и заполняем поле "РабочееМесто".
Для Каждого СтрокаСтажа Из ТабличнаяЧастьСтажа Цикл
// Здесь мы реализуем вашу логику определения значения для поля "РабочееМесто".
// Например, можно получать данные из регистра сведений о рабочих местах,
// из кадровых документов сотрудника или других источников.
// Допустим, мы заполняем его для сотрудников с особыми условиями труда.
// Пример: заполняем, если поле еще не заполнено
Если СтрокаСтажа.РабочееМесто = "" ИЛИ СтрокаСтажа.РабочееМесто = Неопределено Тогда
// Условная логика заполнения
Если СтрокаСтажа.КодОсобыхУсловий = "27-1" Тогда
СтрокаСтажа.РабочееМесто = "Подземные работы";
ИначеЕсли СтрокаСтажа.ТерриториальныеУсловия = "РКС" Тогда
СтрокаСтажа.РабочееМесто = "Районы Крайнего Севера (Пример)";
Иначе
СтрокаСтажа.РабочееМесто = "Основное рабочее место";
КонецЕсли;
КонецЕсли;
КонецЦикла;
// 5. После внесения всех изменений в табличную часть объекта,
// необходимо записать и провести документ. Это запустит логику проведения,
// которая сохранит изменения в базе данных.
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ " + ДокументОбъект.Номер + " от " + ДокументОбъект.Дата + " успешно заполнен и проведен.");
Исключение
Сообщить("Ошибка при проведении документа: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
Иначе
Сообщить("Табличная часть 'ПериодыСтажа' не найдена в документе. Проверьте структуру конфигурации.");
КонецЕсли;
Различия версий ПРОФ и КОРП: Действительно, в версиях ПРОФ некоторых конфигураций 1С функционал по автоматическому заполнению данных стажа может быть ограничен по сравнению с КОРП. Это часто является причиной, по которой приходится прибегать к программному заполнению таких полей, как РабочееМесто.
Регистры сведений: Хотя поле РабочееМесто может не быть прямым реквизитом регистра сведений ЗаписиОСтажеСведенияОСтраховомСтажеЗастрахованныхЛицСЗВ_СТАЖ, данные из него все равно используются при формировании записей в этот и другие связанные регистры (например, ПараметрыПериодовСтажаСФР и ПериодыСтажаСФР в современных реализациях). Логика ОбработкиПроведения документа определяет, как данные из табличных частей объекта преобразуются в записи регистров.
Клиент-серверное взаимодействие: При работе с управляемыми формами важно понимать, что действия могут выполняться как на клиенте, так и на сервере. Программное изменение данных документа и его проведение (ДокументОбъект.Записать()) всегда происходит на сервере. Если вы работаете в обработчике на клиенте, который меняет форму, вам потребуется серверный вызов для сохранения и проведения документа.
Расширения конфигурации: Для реализации такой логики рекомендуется использовать расширения конфигурации. Это позволяет вносить изменения без снятия конфигурации с поддержки, что значительно упрощает обновление. В расширении можно добавить внешнюю обработку или изменить модуль объекта документа для автоматического заполнения поля РабочееМесто перед проведением или при записи.
Актуальность форм отчетности: Всегда помните, что формы отчетности (СЗВ-СТАЖ/ЕФС-1) постоянно обновляются в соответствии с изменениями законодательства. Убедитесь, что ваша конфигурация и логика заполнения соответствуют последним требованиям.
Таким образом, решение проблемы сохранения программно заполненного поля РабочееМесто в документе СЗВ-СТАЖ (ЕФС-1) в 1С сводится к одному ключевому действию: необходимо программно провести документ после внесения всех необходимых изменений в его табличные части. Механизм проведения документа содержит всю необходимую логику для обработки данных формы и их корректного сохранения в базе данных. Используя представленные подходы и примеры кода, вы сможете автоматизировать заполнение этого поля, обеспечивая точность и своевременность формирования отчетности.