При ведении учета в программе 1С:Бухгалтерия 3.0 (или в отраслевых решениях на ее базе, таких как 1С:Общепит) часто возникает ситуация, когда бизнес масштабируется. Открытие новой торговой точки или дополнительного склада требует перехода от суммового или котлового учета к полноценному складскому учету. В этот момент администратор включает заветный флажок в настройках параметров учета, но сталкивается с неожиданным поведением системы: все накопленные годами остатки товаров «зависают» на пустом складе (в проводках отображаются пустые скобки <...>).
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем техническую суть происходящего в базе данных и рассмотрим несколько способов решения этой задачи — от простых бухгалтерских операций до написания собственной автоматизированной обработки.
Давайте разберем по шагам, что происходит в системе, когда мы включаем складской учет. В программе 1С:Бухгалтерия 3.0 за это отвечает настройка, расположенная по пути: Администрирование — Параметры учета — Настройки плана счетов — Учет запасов. При установке флажка «По складам (количеству и сумме)» система автоматически добавляет на счета учета ТМЦ (такие как 10 «Материалы», 41 «Товары», 43 «Готовая продукция») дополнительное субконто — «Склады».
С этого момента для любого нового документа поле «Склад» становится обязательным для заполнения, и движения формируются с указанием конкретного места хранения. Однако для документов, которые были проведены в системе до включения этой настройки (например, с 2011 года, как у автора темы), проводки в регистре бухгалтерии Хозрасчетный остаются прежними. В них субконто «Склады» просто отсутствует или имеет пустое значение Неопределено (которое на уровне интерфейса визуализируется как <...>).
В результате возникает критическая коллизия:
Важный нюанс интерфейса: Если в вашем справочнике «Склады» создан всего один элемент (например, склад «Основной»), программа 1С интеллектуально скрывает поле выбора склада в документах поступления и реализации, считая его избыточным. Чтобы поле «Склад» физически отобразилось в формах документов, в справочнике обязательно должно быть создано как минимум два склада. Помните об этом при диагностике интерфейса.
Если база данных ведется много лет, простое перепроведение документов за прошлые периоды — это катастрофа. Оно приведет к изменению последовательности проведения, нарушению границы закрытия месяцев, изменению себестоимости и, как следствие, искажению сданной налоговой отчетности. Поэтому лучшим решением является точечное изменение субконто непосредственно в проводках регистров без перепроведения самих документов-регистраторов.
Проанализируем, как это можно сделать программно. Нам необходимо написать внешнюю обработку, которая выберет движения по регистру бухгалтерии за нужный период, найдет пустые субконто «Склады» и заменит их на выбранный пользователем склад (например, «Основной склад»).
Рассмотрим пример программного кода на языке 1С, который решает эту задачу:
Процедура ЗаполнитьПустыеСкладыНаСервере(ВыбранныйСклад)
// Выбираем проводки по счетам учета товаров и материалов, где склад не заполнен
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Хозрасчетный.Регистратор КАК Регистратор
|ИЗ
| РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Счет В ИЕРАРХИИ (&СчетаУчета)
| И (Хозрасчетный.Субконто1 = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
| ИЛИ Хозрасчетный.Субконто2 = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
| ИЛИ Хозрасчетный.Субконто3 = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка))";
СписокСчетов = Новый Массив;
СписокСчетов.Добавить(ПланыСчетов.Хозрасчетный.ТоварыНаСкладах); // 41.01
СписокСчетов.Добавить(ПланыСчетов.Хозрасчетный.МатериалыВПроводках); // 10.01 (пример)
Запрос.УстановитьПараметр("СчетаУчета", СписокСчетов);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Получаем набор записей регистра по регистратору
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписей.Прочитать();
Модифицирован = Ложь;
Для Каждого Запись Из НаборЗаписей Цикл
// Проверяем Дт
Если СписокСчетов.Найти(Запись.СчетДт) <> Неопределено Тогда
Для Каждого КлючЗначение Из Запись.СубконтоДт Цикл
Если КлючЗначение.Ключ.ТипЗначения.СодержитТип(Тип("СправочникСсылка.Склады")) Тогда
Если Не ЗначениеЗаполнено(КлючЗначение.Значение) Тогда
Запись.СубконтоДт[КлючЗначение.Ключ] = ВыбранныйСклад;
Модифицирован = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
// Проверяем Кт
Если СписокСчетов.Найти(Запись.СчетКт) <> Неопределено Тогда
Для Каждого КлючЗначение Из Запись.СубконтоКт Цикл
Если КлючЗначение.Ключ.ТипЗначения.СодержитТип(Тип("СправочникСсылка.Склады")) Тогда
Если Не ЗначениеЗаполнено(КлючЗначение.Значение) Тогда
Запись.СубконтоКт[КлючЗначение.Ключ] = ВыбранныйСклад;
Модифицирован = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если Модифицирован Тогда
// Отключаем проверки при записи, чтобы не нарушать бизнес-логику прошлых периодов
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Преимущества этого способа: Документы не перепроводятся, хронология не нарушается, себестоимость не пересчитывается. База приводится в порядок мгновенно и безболезненно для бухгалтера.
Важное предупреждение: Перед запуском любых подобных обработок обязательно делайте резервную копию (архив) базы данных! Также учтите, что если организация использует партионный учет по УСН или ведет учет НДС, аналогичные действия может потребоваться выполнить по регистрам накопления (например, РасходыПриУСН или НДСПредъявленный).
Если прошлые периоды закрыты и защищены от изменений «намертво» (например, сдана отчетность и установлен запрет изменения данных), то лезть в проводки прошлых лет не рекомендуется. В этом случае мы можем перенести остатки текущей датой (или датой начала нового отчетного периода, например, 1 января текущего года).
Рассмотрим, как выполнить эту процедуру:
10, 21, 41, 43 в разрезе субконто «Склады» на дату переноса. В ОСВ мы увидим остатки товаров, висящие на пустом складе <...>.<...>).Поскольку вручную набивать тысячи позиций номенклатуры невозможно, для автоматического заполнения такой операции обычно пишется простая обработка, которая считывает остатки по пустому складу на определенный момент времени и программно создает строки в документе «Операция».
Минусы метода: В текущем периоде временно раздуваются обороты по счетам учета ТМЦ, так как происходит внутреннее движение «сам на себя». Кроме того, ручная операция может некорректно сработать для партионного учета (ФИФО), так как программа может «потерять» связь с первичными документами поступления.
Некоторые специалисты на форумах рекомендуют воспользоваться стандартным складским циклом: провести инвентаризацию, списать остатки с пустого склада документом «Списание товаров» и оприходовать их на новый склад документом «Оприходование товаров».
Давайте проанализируем этот сценарий и выясним, почему его категорически не рекомендуется использовать компаниям на УСН («Доходы минус расходы») и организациям, ведущим строгий партионный учет:
Иногда пользователи пытаются сделать документ «Перемещение товаров» напрямую с пустого склада на «Основной». Однако при попытке провести такой документ система выдаст ошибку: поле «Склад-отправитель» является обязательным к заполнению, и выбрать туда пустое значение физически невозможно.
Но этот барьер можно обойти:
Мы рассмотрели различные пути выхода из сложившейся ситуации. Если перед вами стоит задача исправить учет в базе данных с большой историей без ущерба для прошлых периодов, то самым надежным, чистым и профессиональным решением является Способ 1 (точечная корректировка записей регистра с помощью внешней обработки).
Если же вы не обладаете навыками программирования, воспользуйтесь Способом 2 (перенос остатков вручную через Операцию на дату начала нового периода), предварительно проконсультировавшись с главным бухгалтером относительно ведения партионного учета в вашей конфигурации.