В процессе работы с 1С:Бухгалтерия 3.0 часто возникает необходимость изменения аналитики учета. Одним из таких кейсов является включение учета по складам на счете 41 «Товары», если ранее он не велся. Эта задача может показаться нетривиальной, особенно когда в базе уже накопились данные за прошлые периоды. В данном руководстве мы подробно рассмотрим, как активировать учет по складам, как поступить с историческими данными и как создать обработку для переноса остатков с «пустого» склада на конкретный.
Представьте ситуацию: ваша организация долгое время вела учет товаров на счете 41 без детализации по складам. Все операции по поступлению и реализации товаров относились к условному «основному» складу, либо вовсе не имели аналитики по местам хранения. Однако, в связи с расширением бизнеса, например, открытием нового офиса или склада в другом городе, возникла острая необходимость вести полноценный складской учет. При включении соответствующей настройки в 1С, все существующие остатки за прошлые периоды останутся без указания склада, то есть на так называемом «пустом» складе. Это создает проблему, поскольку новые документы будут формировать движения уже с указанием склада, что нарушит целостность учета и затруднит получение корректных данных по остаткам.
Прежде чем приступать к переносу остатков, нам необходимо активировать функционал учета по складам в вашей конфигурации 1С:Бухгалтерия 3.0. Эта настройка выполняется в пользовательском режиме и не требует внесения изменений в конфигуратор.
После сохранения этих настроек на счете 41 (и других товарных счетах) появится дополнительное субконто «Склады», доступное для заполнения.
После активации учета по складам возникает вопрос: что делать с уже закрытыми периодами, в которых субконто «Склад» было пустым? Здесь есть несколько подходов:
Этот подход гарантирует отсутствие «пустых» складов, но требует больше операций и внимательности.
В большинстве случаев, если речь идет о старых, закрытых периодах, и нет критической необходимости в детализации по складам в прошлом, рекомендуется либо оставить их как есть, либо воспользоваться методом переноса остатков текущей датой с помощью операции.
Мы рассмотрим самый распространенный и удобный вариант — создание внешней обработки, которая сформирует бухгалтерскую операцию по переносу остатков с «пустого» склада на указанный «Основной склад». Это позволит исправить ситуацию, не затрагивая прошлые закрытые периоды.
Для этого нам понадобится создать внешнюю обработку, которая будет иметь форму с полями для выбора организации, счета (41.01 в нашем случае), даты, на которую формируются движения, и кнопки для запуска заполнения. В теле обработки мы напишем код, который выполнит запрос к регистру бухгалтерии, найдет остатки без склада и сформирует необходимые проводки.
Предположим, у нас есть внешняя обработка с формой, содержащей реквизиты: Организация (тип СправочникСсылка.Организации), Счет (тип ПланСчетовСсылка.Хозрасчетный), Дата (тип Дата) и кнопка Заполнить, которая вызывает процедуру ЗаполнитьНаСервере().
Шаг 1: Запрос к регистру бухгалтерии
Начнем с запроса, который выбирает остатки по счету 41 на указанную дату, где субконто2 (Склад) является пустым. Важный момент: в 1С пустое значение ссылочного типа (такого как Склад) представляет собой не NULL и не пустую строку, а специальную «пустую ссылку». Поэтому в запросе мы должны искать именно ее.
&НаСервере
Процедура ЗаполнитьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйОстатки.Счет КАК Счет,
| ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
| ХозрасчетныйОстатки.Субконто2 КАК Склад,
| ХозрасчетныйОстатки.Организация КАК Организация,
| ХозрасчетныйОстатки.КоличествоОстатокДт КАК КоличествоОстатокДт,
| ХозрасчетныйОстатки.СуммаОстатокДт КАК СуммаОстатокДт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаСведений, Счет = &Счет, , ) КАК ХозрасчетныйОстатки
|ГДЕ
| ХозрасчетныйОстатки.Счет = &Счет
| И ХозрасчетныйОстатки.Организация = &Организация
| И ХозрасчетныйОстатки.Субконто2 = &Субконто2"; // Ищем пустую ссылку
Запрос.УстановитьПараметр("Организация", Объект.Организация);
Запрос.УстановитьПараметр("Счет", Объект.Счет);
Запрос.УстановитьПараметр("Субконто2", Справочники.Склады.ПустаяСсылка()); // Передаем пустую ссылку склада
Запрос.УстановитьПараметр("ДатаСведений", НачалоДня(Объект.Дата));
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
// ... дальнейшая часть кода ...
КонецПроцедуры
В этом запросе мы выбираем счет, номенклатуру (Субконто1), текущее значение склада (Субконто2), организацию и количество/сумму остатка по дебету. Параметр &Субконто2 устанавливается как Справочники.Склады.ПустаяСсылка(), что позволяет найти все остатки, для которых склад не был указан.
Шаг 2: Формирование движений в операции
После получения результата запроса нам нужно создать документ Операция (бухгалтерский и налоговый учет) и заполнить его движениями. Каждая строка результата запроса будет формировать две проводки: кредитовую (списание с «пустого» склада) и дебетовую (оприходование на «Основной склад»).
&НаСервере
Процедура ЗаполнитьНаСервере()
// ... Начало процедуры с запросом ...
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
// Создаем документ "Операция (бухгалтерский и налоговый учет)"
Операция = Документы.ОперацияБухгалтерская.СоздатьДокумент();
Операция.Дата = Объект.Дата;
Операция.Организация = Объект.Организация;
Операция.Содержание = "Перенос остатков по счету 41 с 'пустого' склада на 'Основной склад'";
// Получаем набор записей регистра Хозрасчетный
НаборДвижений = Операция.Движения.Хозрасчетный;
НаборДвижений.Очистить(); // Очищаем существующие движения, если они есть
// Определяем Основной склад, на который будем переносить
ОсновнойСклад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
Если ОсновнойСклад.Пустая() Тогда
ВызватьИсключение "Не найден 'Основной склад'. Проверьте название или создайте его.";
КонецЕсли;
Для каждого ТекСтрока из РезультатЗапроса Цикл
// Проводка КРЕДИТ: Списание с "пустого" склада
НовСтрокаКт = НаборДвижений.Добавить();
НовСтрокаКт.Период = Операция.Дата;
НовСтрокаКт.Организация = Операция.Организация;
НовСтрокаКт.СчетДт = ПланыСчетов.Хозрасчетный.ТранзитныйСчет; // Используем транзитный счет или 000
НовСтрокаКт.СчетКт = Объект.Счет;
НовСтрокаКт.КоличествоКт = ТекСтрока.КоличествоОстатокДт;
НовСтрокаКт.Сумма = ТекСтрока.СуммаОстатокДт;
НовСтрокаКт.СубконтоКт.Номенклатура = ТекСтрока.Номенклатура;
НовСтрокаКт.СубконтоКт.Склады = Справочники.Склады.ПустаяСсылка(); // Указываем, что списываем с пустого
НовСтрокаКт.Регистратор = Операция.Ссылка;
// Проводка ДЕБЕТ: Оприходование на "Основной склад"
НовСтрокаДт = НаборДвижений.Добавить();
НовСтрокаДт.Период = Операция.Дата;
НовСтрокаДт.Организация = Операция.Организация;
НовСтрокаДт.СчетДт = Объект.Счет;
НовСтрокаДт.СчетКт = ПланыСчетов.Хозрасчетный.ТранзитныйСчет; // Используем тот же транзитный счет или 000
НовСтрокаДт.КоличествоДт = ТекСтрока.КоличествоОстатокДт;
НовСтрокаДт.Сумма = ТекСтрока.СуммаОстатокДт;
НовСтрокаДт.СубконтоДт.Номенклатура = ТекСтрока.Номенклатура;
НовСтрокаДт.СубконтоДт.Склады = ОсновнойСклад; // Указываем Основной склад
НовСтрокаДт.Регистратор = Операция.Ссылка;
КонецЦикла;
// Записываем движения
// Важно: если используете Документы.ОперацияБухгалтерская.СоздатьДокумент(), то движения записываются вместе с документом
// Если бы мы писали напрямую в набор записей, то нужен был бы НаборДвижений.Записать();
Попытка
Операция.Записать(РежимЗаписиДокумента.Проведение); // Записываем и проводим документ
Сообщить("Операция по переносу остатков успешно создана и проведена.");
Исключение Э
Сообщить("Ошибка при записи операции: " + Э.Описание);
КонецПопытки;
КонецПроцедуры
Пояснения к коду:
ОперацияБухгалтерская, заполняем его шапку (дата, организация, содержание).НаборДвижений = Операция.Движения.Хозрасчетный;. Это более корректный способ работы с движениями документа.ПланыСчетов.Хозрасчетный.ТранзитныйСчет. В 1С:Бухгалтерии 3.0 нет явного счета 000. В зависимости от настроек вашего плана счетов и специфики, вы можете использовать, например, счет 76.09 "Прочие расчеты с разными дебиторами и кредиторами" или создать специальный вспомогательный счет (например, 00) с соответствующими настройками, чтобы он не влиял на баланс. Если такого нет, можно использовать, например, технический счет 76.09 (Прочие расчеты) временно. Суммы по дебету и кредиту этого счета в рамках одной операции будут равны, поэтому он не повлияет на отчетность.Объект.Счет) и субконто "пустая ссылка на Склад" в дебет транзитного счета.Объект.Счет), но уже с указанием ОсновнойСклад.НовСтрока.СубконтоДт.Номенклатура = ТекСтрока.Номенклатура; и аналогично для кредита: мы заполняем субконто "Номенклатура".НовСтрока.СубконтоДт.Склады = ОсновнойСклад; и НовСтрока.СубконтоКт.Склады = Справочники.Склады.ПустаяСсылка();: Здесь мы явно указываем склад, на который переносим, и пустой склад, с которого списываем.Операция.Записать(РежимЗаписиДокумента.Проведение);: Записываем и проводим созданный документ. Это гарантирует, что все движения будут сформированы и учтены в регистрах.Если ваше обособленное подразделение ведет учет на общем балансе, то описанный выше метод с переносом остатков по складам будет вполне применим.
Для выявления таких ошибок регулярно формируйте оборотно-сальдовую ведомость по счету 41 с детализацией по субконто «Склады» и «Номенклатура».
Переход на учет по складам в середине учетного периода или изменение аналитики по счету 41 — это серьезный шаг, требующий внимательного подхода. Однако, следуя изложенным рекомендациям и используя предложенную обработку, вы сможете обеспечить корректность и достоверность вашего бухгалтерского учета.