При разработке внешних обработок и алгоритмов групповой корректировки данных в 1С:Бухгалтерии разработчики нередко сталкиваются с ситуацией, когда требуется изменить описание конкретной бухгалтерской записи в документе ОперацияБух (или Операция). Попытка найти табличную часть с проводками непосредственно в объекте документа приводит в тупик: в структуре реквизитов объекта есть только реквизит шапки Содержание, а табличная часть с проводками отсутствует.
Выясним причину такого поведения метаданных и разберем по шагам, где физически хранятся проводки и как правильно модифицировать реквизит Содержание бухгалтерских записей.
В платформе 1С:Предприятие бухгалтерские проводки не хранятся в табличных частях документов. Проводки представляют собой движения по регистру бухгалтерии (в типовых конфигурациях для коммерческих организаций это регистр Хозрасчетный). Таблица, которую пользователь видит на форме документа ручной операции, — это не табличная часть объекта метаданных Документ, а отображение набора записей регистра с отбором по текущему документу-регистратору.
Следовательно, для программного чтения или перезаписи данных в проводках нам необходимо обращаться к движениям документа либо напрямую к набору записей регистра бухгалтерии Хозрасчетный.
Рассмотрим вариант, когда у нас уже есть ссылка на документ или получен сам объект документа. В этом случае мы можем обратиться к свойству объекта Движения.
Разберем по шагам последовательность действий:
ПолучитьОбъект().Движения.Хозрасчетный.Прочитать(), чтобы считать существующие проводки из базы данных в память.Содержание.Записать().Посмотрим на пример реализации данного алгоритма:
// Находим нужный документ (например, по номеру и дате)
СсылкаНаДокумент = Документы.ОперацияБух.НайтиПоНомеру("00000000718", Дата(2016, 12, 31));
Если Не ЗначениеЗаполнено(СсылкаНаДокумент) Тогда
ВызватьИсключение "Документ с указанным номером и датой не найден!";
КонецЕсли;
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// Получаем набор записей движений документа
НаборЗаписей = ДокументОбъект.Движения.Хозрасчетный;
// Считываем текущие проводки документа
НаборЗаписей.Прочитать();
// Обходим проводки и корректируем содержание
Для Каждого Проводка Из НаборЗаписей Цикл
Проводка.Содержание = "Корректировка остатков";
КонецЦикла;
// Записываем измененный набор движений в базу данных
НаборЗаписей.Записать();
Проанализируем второй способ, который считается наиболее производительным и архитектурно правильным. Если перед нами стоит задача отредактировать исключительно проводки, получать сам объект документа через ПолучитьОбъект() избыточно. Вызов метода ПолучитьОбъект() приводит к загрузке всех данных документа в оперативную память и наложению лишних блокировок данных.
Значительно безопаснее и быстрее создать набор записей непосредственно из менеджера регистра бухгалтерии, установив отбор по регистратору:
// Создаем независимый набор записей регистра бухгалтерии
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
// Устанавливаем жесткий отбор по нашему документу
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
// Считываем записи регистра по установленному отбору
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
Запись.Содержание = "Корректировка расчетного счета";
КонецЦикла;
// Записываем набор обратно в базу данных
НаборЗаписей.Записать();
При программной работе с движениями ручных операций важно учитывать следующие практические особенности платформы 1С:
Прочитать(). Метод Записать() у набора записей по умолчанию выполняется с параметром Замещать = Истина. Если перед циклом забыть вызвать НаборЗаписей.Прочитать(), платформа посчитает набор пустым и метод Записать() просто удалит все существующие проводки документа.Содержание проводки в типовом регистре бухгалтерии Хозрасчетный имеет ограниченную длину (как правило, до 100 символов). Если передать строку большего размера, платформа автоматически усечет текст до максимальной длины метаданных без генерации ошибок.НайтиПоНомеру(). Метод НайтиПоНомеру() чувствителен к точной длине строки номера, префиксам организации и информационных баз, а также ведущим нулям. Если в одном периоде работают несколько организаций с пересекающейся нумерацией, метод может вернуть некорректную ссылку. Для надежного поиска документов в пакетных обработках рекомендуется использовать запрос 1С с отбором по номеру, организации и периоду.ОперацияБух не использует стандартный механизм проведения через ОбработкаПроведения. В шапке документа присутствует реквизит СуммаОперации. Если при модификации движений вы изменяете не только текстовое содержание, но и суммы проводок, сумма в шапке документа автоматически не пересчитается. В этом случае потребуется открыть и пересчитать реквизит через запись самого объекта документа.