При автоматизации учета в 1С часто возникает задача программного создания документа Операция, введенная вручную (в метаданных — ОперацияБух). Особенность этого документа в том, что он является универсальным контейнером: помимо проводок по бухгалтерскому учету, он может содержать записи по любым регистрам сведений и накопления. Однако просто записать данные в регистр недостаточно — нужно еще «подрубить» этот регистр к документу так, чтобы пользователь увидел его в интерфейсе. В этой статье мы подробно разберем, как это сделать правильно.
Для того чтобы наш программно созданный документ был корректным и функциональным, нам необходимо выполнить три основных действия:
Рассмотрим каждый этап подробнее на практических примерах.
Сначала нам нужно создать экземпляр документа и получить на него ссылку, так как она потребуется для привязки движений. Проанализируем пример создания объекта:
НовыйДок = Документы.ОперацияБух.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата();
НовыйДок.Организация = Справочники.Организации.НайтиПоНаименованию("ВОДОКАНАЛ-МЫТИЩИ АО");
НовыйДок.Содержание = "Автоматический ввод данных по регистрам";
// Записываем документ, чтобы получить ссылку
НовыйДок.Записать(РежимЗаписиДокумента.Запись);
СсылкаНаДок = НовыйДок.Ссылка;
Важно помнить: для документа ОперацияБух обычно используется РежимЗаписиДокумента.Запись, так как он не имеет стандартной процедуры проведения. Все движения записываются непосредственно вместе с документом.
Выясним, как добавить записи в конкретный регистр. В 1С есть два способа: работа через коллекцию Движения объекта документа или создание отдельного объекта НаборЗаписей. Мы рекомендуем использовать коллекцию Движения, так как это более нативно для объектной модели документа.
Предположим, нам нужно заполнить Регистр сведений (например, сведения об основных средствах). Разберем код:
// Работаем с коллекцией движений конкретного документа
ЗаписьРегистра = НовыйДок.Движения.ПараметрыАмортизацииОСБухгалтерскийУчет.Добавить();
ЗаписьРегистра.Период = НовыйДок.Дата;
ЗаписьРегистра.Регистратор = СсылкаНаДок;
ЗаписьРегистра.Организация = НовыйДок.Организация;
// Заполняем остальные реквизиты и измерения
ЗаписьРегистра.ОсновноеСредство = НайденнаяНоменклатура;
ЗаписьРегистра.СтоимостьДляВычисленияАмортизации = 100000;
// Обязательно устанавливаем флаг записи для этого набора движений
НовыйДок.Движения.ПараметрыАмортизацииОСБухгалтерскийУчет.Записывать = Истина;
Если вы предпочитаете использовать НаборЗаписей (как обсуждалось в сообщениях форума), код будет выглядеть так:
НаборЗаписей = РегистрыСведений.ИмяНужногоРегистра.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДок);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Регистратор = СсылкаНаДок;
НоваяЗапись.Период = НовыйДок.Дата;
// Заполнение данных...
ЗаполнитьЗначенияСвойств(НоваяЗапись, ИсточникДанных);
НаборЗаписей.Записать();
Важный нюанс: Перед использованием регистра в коде убедитесь в Конфигураторе, что документ ОперацияБух выбран в качестве Регистратора для этого регистра. В противном случае система выдаст ошибку при попытке записи.
Это самый важный момент, на котором часто «застревают» новички. Если вы просто запишете движения, они появятся в базе, но пользователь, открыв документ в интерфейсе 1С:Бухгалтерии, не увидит закладок этих регистров. В документе ОперацияБух за это отвечают служебные табличные части.
В зависимости от конфигурации и типа регистра, это могут быть таблицы: ТаблицаРегистровСведений, ТаблицаРегистровНакопления или ТаблицаРегистровБухгалтерии. Проанализируем, как программно добавить в них информацию:
// Добавляем запись о том, что документ использует регистр сведений
НоваяСтрокаТаблицы = НовыйДок.ТаблицаРегистровСведений.Добавить();
// Имя нужно указывать в точности так, как оно называется в метаданных
НоваяСтрокаТаблицы.Имя = "ПараметрыАмортизацииОСБухгалтерскийУчет";
// Если нужно добавить регистр накопления
НоваяСтрокаНакопления = НовыйДок.ТаблицаРегистровНакопления.Добавить();
НоваяСтрокаНакопления.Имя = "НДСПредъявленный";
После заполнения этих таблиц система при открытии формы документа «поймет», какие вкладки нужно отрисовать на экране. Без этого шага данные останутся «невидимыми» для ручного редактирования.
Объединим все вышесказанное в единый алгоритм, который можно использовать в обработке заполнения:
Процедура СоздатьОперациюВручнуюНаСервере()
НовыйДок = Документы.ОперацияБух.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата();
НовыйДок.Организация = Справочники.Организации.НайтиПоНаименованию("Наша Организация");
НовыйДок.Содержание = "Автоматическая загрузка данных";
// 1. Сначала записываем, чтобы получить ссылку
НовыйДок.Записать();
// 2. Добавляем информацию о регистре в служебную таблицу (для видимости)
СтрРегистра = НовыйДок.ТаблицаРегистровСведений.Добавить();
СтрРегистра.Имя = "СчетаУчетаНоменклатуры"; // Пример имени регистра
// 3. Заполняем сами движения
Движение = НовыйДок.Движения.СчетаУчетаНоменклатуры.Добавить();
Движение.Регистратор = НовыйДок.Ссылка;
Движение.Период = НовыйДок.Дата;
Движение.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00001");
Движение.СчетУчета = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
// Устанавливаем флаг записи движений
НовыйДок.Движения.СчетаУчетаНоменклатуры.Записывать = Истина;
// 4. Финальная запись документа со всеми изменениями
Попытка
НовыйДок.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Документ успешно создан: " + НовыйДок.Ссылка);
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Проанализировав ситуацию, мы выяснили, что ключ к успеху лежит в понимании структуры документа ОперацияБух. Посмотрим на главные выводы:
Имя нужно передавать именно строковое имя объекта метаданных.Движения.ИмяРегистра поле Регистратор часто заполняется платформой автоматически при записи, но явное указание (особенно если объект еще не записан в базу) страхует от ошибок.ПриЧтенииНаСервере или ПриСозданииНаСервере на основании тех самых служебных таблиц. Не игнорируйте их заполнение.Используя этот подход, вы сможете программно генерировать любые сложные операции, которые будут выглядеть и вести себя так же, как если бы их ввел опытный бухгалтер вручную.