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