Документ «Инвентаризация товаров на складе»
Документ фиксирует результат пересчёта ТМЗ на складе: подтягивает учётные остатки, вы вносите фактические количества, программа считает отклонения (недостачи/излишки) и печатает ИНВ-10 и ИНВ-18. Документ непроводимый — он ничего не списывает и не делает проводок; это «фотография» расхождений и основание для последующих документов оприходования излишков и списания недостач.
🎯 Что это и зачем
Раз в год (а часто и чаще — при смене материально ответственного лица, перед аудитом, после порчи/кражи) товар на складе пересчитывают вживую и сравнивают с тем, что числится в базе. Документ «Инвентаризация товаров на складе» — рабочее место этого сравнения:
- подтягивает учётные остатки ТМЗ (количество и сумму) на дату документа — кнопкой «Заполнить по остаткам»;
- даёт внести фактическое количество по каждой позиции (вручную или сканером штрихкодов);
- автоматически считает отклонение = факт − учёт (минус — недостача, плюс — излишек);
- хранит состав инвентаризационной комиссии и печатает официальные формы ИНВ-10 (опись) и ИНВ-18 (сличительная ведомость).
Кто работает: кладовщики и бухгалтеры по складу. Периодичность — от ежегодной до выборочной по отдельному складу.
Проведение = Запретить.🧭 Где найти в программе
Раздел «Склад» → пункт «Инвентаризация ТМЗ на складе». Откроется журнал; новый документ создаём кнопкой «Создать».
navigation-map.json этого документа нет — точное имя пункта в левом меню вашей сборки Fresh может отличаться. Раздел «Склад» определён по подсистемам объекта и расположению справочника «Склады» («Номенклатура и склад»). Если пункта не видно — проверьте, включена ли подсистема складского учёта в настройках, либо ищите документ через «Все функции» / по полнотекстовому поиску «Инвентаризация».👤 Часть 1. Для пользователя
Проходим по шагам: от пустого документа до готовой описи с подсчитанными отклонениями.
Урок 1. Инвентаризация по одному складу (выборочная)
Когда: плановая или внеплановая проверка остатков на конкретном складе.
Шаг 1. Создаём документ и выбираем вид операции
«Создать». Первое и главное поле — Вид операции: - По складу — пересчёт одного склада (поле «Склад» становится видимым и обязательным); - По организации — полная инвентаризация по всем складам (поле «Склад» скрывается).
Шаг 2. Заполняем шапку
- Организация — обязательно (по ней отбираются остатки).
- Склад — обязательно для вида «По складу».
- Структурное подразделение — ответственное подразделение (необязательно).
- Дата начала / окончания инвентаризации, Причина проведения, реквизиты документа-основания (приказ/распоряжение: вид, номер, дата) — для печатных форм.
Шаг 3. Заполняем учётные остатки
Кнопка «Заполнить по остаткам на складе». Программа в фоновом режиме (с окном ожидания) загрузит в таблицу Товары все позиции с ненулевым остатком: проставит Номенклатуру, Счёт учёта (БУ), Учётное количество, а для счетов с суммовым учётом — Учётную сумму и Цену.
Шаг 4. Вносим фактическое количество
Главная ручная работа: в колонке Количество проставляем то, что реально пересчитали на складе. Поле Учётное количество — только для чтения. Колонка Отклонение = Количество − Учётное количество пересчитывается на лету.
Сканером штрихкодов: кнопка «Добавить по штрихкоду» — найденная позиция добавится строкой или увеличит количество существующей.
Шаг 5. Заполняем комиссию (для печати)
Кнопка «Комиссия» → выбираем физических лиц из справочника, одному ставим признак Председатель. Без комиссии формы ИНВ-10/ИНВ-18 напечатаются без подписей.
Шаг 6. Записываем и печатаем
«Записать» или «Записать и закрыть». Кнопки «Провести» здесь нет — документ непроводимый. Затем «Печать» → выбираем форму: - «Инвентаризация товаров на складе» — основная форма документа; - «ИНВ-10 (Инвентаризационная опись запасов)»; - «ИНВ-18 (Сличительная ведомость)»; - «Комплект документов» / «…(на принтер)» / «Настраиваемый комплект документов» — пакетом.
Урок 2. Инвентаризация по всей организации (полная)
Отличия от Урока 1: 1. Вид операции — «По организации»; поле Склад скрыто и не требуется. 2. «Заполнить по остаткам» загрузит остатки по всем складам организации (таблица может быть очень большой). 3. Фактические количества вносите по результатам пересчёта всех мест хранения.
Урок 3. Перезаполнить учётные количества и суммы
Если после загрузки остатков поменялись цены/курс или вы случайно сбили учётные данные — кнопка «Перезаполнить учётные количества и суммы». Программа переспросит подтверждение и пересчитает колонки Учётное количество и Учётная сумма заново из регистров, не трогая введённые вами фактические количества и суммы. Отклонения пересчитаются.
Что после инвентаризации
Документ инвентаризации — это итог сравнения, а не движение по складу. Дальше по выявленным отклонениям оформляются отдельные документы: - излишки (отклонение «+») — оприходование (Дт счёта запасов — Кт прочих доходов); - недостачи (отклонение «−») — списание / отнесение на виновное лицо.
🛠 Часть 2. Для программиста
Источник: реальный код релиза 3.0.72.1 (Documents/ИнвентаризацияТоваровНаСкладе/Ext/ObjectModule.bsl, .../Ext/ManagerModule.bsl, .../Forms/ФормаДокумента/Ext/Form/Module.bsl), метаданные Documents/ИнвентаризацияТоваровНаСкладе.xml, плюс разбор objects/ и business-logic/.
Главное: документ непроводимый
В метаданных объекта:
<Posting>Deny</Posting>
<RegisterRecords/>
Проведение = Запретить, набор регистраторов пуст. Документ не формирует движений ни по регистрам бухгалтерии (Типовой/Налоговый), ни по регистрам накопления (товарные остатки), ни по оборотным регистрам. Кнопки «Провести» в форме нет. Всё, что он делает, — хранит таблицу факт/учёт и печатает формы. Поэтому раздела «движения по регистрам» и «таблицы проводок Дт/Кт» у этого документа не существует — и это не пробел, а конструкция.
Структура объекта
Реквизиты шапки. Обязательные (ЗаполнениеОбязательно = ВыдаватьОшибку): Организация, ВидОперации (Перечисление.ВидыОперацийИнвентаризация: ПоСкладу / ПоОрганизации). Условно-обязательный: Склад (только при ВидОперации = ПоСкладу, проверка в форме). Прочие: СтруктурноеПодразделение, ДатаНачалаИнвентаризации, ДатаОкончанияИнвентаризации, ПричинаПроведенияИнвентаризации, ДокументОснованиеВид/Номер/Дата, Ответственный, Автор, Комментарий.
Табличная часть Товары: Номенклатура, ЕдиницаИзмерения, Коэффициент, Количество (факт), КоличествоУчет (учёт, read-only), Цена, Сумма, СуммаУчет, СчетУчетаБУ (ПланСчетов.Типовой). Колонка Отклонение — расчётная (факт − учёт), в базе не хранится, заполняется в форме.
Табличная часть ИнвентаризационнаяКомиссия: ФизЛицо (Справочник.ФизическиеЛица), Председатель (Булево). Только для печатных форм.
Жизненный цикл (обработчики ObjectModule)
ObjectModule.bsl крошечный (≈40 строк) — в нём нет ни ОбработкаПроведения, ни ОбработкаПроверкиЗаполнения, ни ПередЗаписью. Только два обработчика:
| Обработчик | Что делает |
|---|---|
ОбработкаЗаполнения |
Удаляет Автор из переданной структуры (автора назначает система), копирует свойства из ДанныеЗаполнения, затем ЗаполнениеДокументов.ЗаполнитьШапкуДокумента(ЭтотОбъект, ДанныеЗаполнения) |
ПриКопировании |
Сбрасывает Дата = НачалоДня(ОбщегоНазначения.ТекущаяДатаПользователя()) — копия получает текущую дату |
Реальный код целиком:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
Если ТипДанныхЗаполнения = Тип("Структура") Тогда
Если ДанныеЗаполнения.Свойство("Автор") Тогда
ДанныеЗаполнения.Удалить("Автор");
КонецЕсли;
ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения);
КонецЕсли;
ЗаполнениеДокументов.ЗаполнитьШапкуДокумента(ЭтотОбъект, ДанныеЗаполнения);
КонецПроцедуры
Процедура ПриКопировании(ОбъектКопирования)
Дата = НачалоДня(ОбщегоНазначения.ТекущаяДатаПользователя());
КонецПроцедуры
Вывод для разработчика: вся «жизнь» документа — это не проведение, а заполнение табличной части по остаткам. Эта логика вынесена в ManagerModule (сервер) и форму (асинхронный запуск). Туда и смотрим.
Ключевая процедура — заполнение по остаткам склада (реальный код, 3.0.72.1)
Источник: ManagerModule.bsl, ЗаполнитьПоОстаткамНаСкладе (стр. 6). Выполняется в фоновом задании, результат кладётся во временное хранилище. Сокращённо:
Процедура ЗаполнитьПоОстаткамНаСкладе(СтруктураПараметров, АдресХранилища) Экспорт
// 1. Готовим таблицу-отбор: все счета ТМЗ (с субконто "Склады") + вся номенклатура
ОтборОстатков = Новый ТаблицаЗначений();
ОтборОстатков.Колонки.Добавить("СчетУчетаБУ", Новый ОписаниеТипов("ПланСчетовСсылка.Типовой"));
ОтборОстатков.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
// ... запрос к РегистрБухгалтерии.Типовой.Остатки + ПланСчетов.Типовой (счета с ВидСубконто = Склады) ...
// 2. Реальные остатки на дату документа берёт общий модуль учёта товаров
ТаблицаОстатки = УчетТоваров.ПолучитьОстаткиТоваров(
Новый Граница(СтруктураПараметров.Дата, ВидГраницы.Включая),
СтруктураПараметров.Организация,
СтруктураПараметров.СтруктурноеПодразделение,
ОтборОстатков);
ТаблицаОстатки.Свернуть("СчетУчетаБУ,Номенклатура", "Стоимость,Количество,КоличествоПоСкладу");
Для Каждого СтрокаТаблицы Из ТаблицаОстатки Цикл
Если СтрокаТаблицы.Количество = NULL ИЛИ СтрокаТаблицы.Количество <= 0 Тогда
Продолжить; // нулевые/пустые остатки пропускаем
КонецЕсли;
// ведётся ли по счёту суммовой учёт в разрезе складов — кэшируем
ВедетсяСуммовойУчет = ...ВедетсяСуммовойУчетПоСкладам(СтрокаТаблицы.СчетУчетаБУ);
СтрокаТабличнойЧасти = СтруктураПараметров.Товары.Добавить();
Количество = ?(НЕ ВедетсяСуммовойУчет И ЗначениеЗаполнено(СтруктураПараметров.Склад),
СтрокаТаблицы.КоличествоПоСкладу, СтрокаТаблицы.Количество);
СтрокаТабличнойЧасти.Номенклатура = СтрокаТаблицы.Номенклатура;
СтрокаТабличнойЧасти.СчетУчетаБУ = СтрокаТаблицы.СчетУчетаБУ;
СтрокаТабличнойЧасти.Количество = Количество; // ВАЖНО: факт = учёт по умолчанию
СтрокаТабличнойЧасти.КоличествоУчет = Количество;
СтрокаТабличнойЧасти.ЕдиницаИзмерения = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
СтрокаТаблицы.Номенклатура, "БазоваяЕдиницаИзмерения");
СтрокаТабличнойЧасти.Коэффициент = 1;
Если ВедетсяСуммовойУчет Тогда
СтрокаТабличнойЧасти.СуммаУчет = СтрокаТаблицы.Стоимость;
СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.СуммаУчет;
СтрокаТабличнойЧасти.Цена = СтрокаТабличнойЧасти.Сумма / СтрокаТабличнойЧасти.Количество;
КонецЕсли;
КонецЦикла;
// 3. Результат — во временное хранилище (фоновое задание → клиент)
СтруктураДанныхЗаполнения = Новый Структура;
СтруктураДанныхЗаполнения.Вставить("Товары", СтруктураПараметров.Товары);
СтруктураДанныхЗаполнения.Вставить("ЗаполнитьДобавленныеКолонкиТаблиц", Истина);
ПоместитьВоВременноеХранилище(СтруктураДанныхЗаполнения, АдресХранилища);
КонецПроцедуры
Что важно вычитать из кода:
- Источник остатков —
РегистрБухгалтерии.Типовой.Остатки, а конкретные числа возвращает общий модульУчетТоваров.ПолучитьОстаткиТоваров(...). То есть «правда» об остатках — в бухгалтерском регистре по счетам с субконтоСклады, а не в отдельном товарном регистре документа. - Факт инициализируется равным учёту (
Количество = КоличествоУчет). Сразу после автозаполнения отклонение по всем строкам = 0 — это задумано: пользователь правит только реально расходящиеся позиции. - Позиции с остатком ≤ 0 пропускаются (
Продолжить). Отсутствие позиции в таблице после автозаполнения = нулевой/отрицательный учётный остаток. - Суммовой учёт по складам управляет тем, берётся
КоличествоПоСкладуили общееКоличество, и заполняются лиСумма/Цена. Для несуммовых счетов сумма/цена остаются пустыми — это нормально. - Парная процедура
ЗаполнитьПоОстаткамОрганизации(стр. 119) делает то же без фильтра по складу;ПерезаполнитьУчетныеКоличестваИСуммы(стр. 196) обновляет только учётные колонки.
Запуск из формы — асинхронность
Форма не выполняет запрос синхронно. ЗаполнитьПоОстаткамНаСкладе(Команда) (форма, стр. 365) сначала валидирует, потом при непустой таблице переспрашивает и уходит в фон:
Если НЕ ЗначениеЗаполнено(Объект.Склад) И НЕ ЗначениеЗаполнено(Объект.Организация) Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Не заполнен склад для получения остатков!'"),, "Склад", "Объект");
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Не заполнена организация для получения остатков!'"),, "Организация", "Объект");
Возврат;
ИначеЕсли НЕ ЗначениеЗаполнено(Объект.Организация) Тогда
// ... только организация ...
ИначеЕсли НЕ ЗначениеЗаполнено(Объект.Склад)
И Объект.ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперацийИнвентаризация.ПоСкладу") Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Не заполнен склад для получения остатков!'"),, "Склад", "Объект");
Возврат;
КонецЕсли;
Дальше — ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(...), ожидание задания через ПодключитьОбработчикОжидания, чтение результата из АдресХранилища. Вывод для автоматизации: программно дёргать заполнение нужно через серверные процедуры ManagerModule и дожидаться завершения фонового задания, а не имитировать клик по команде формы.
Переключение вида операции
ВидОперацииПриИзменении (форма, стр. 185): при смене вида, если таблица непуста, выводит вопрос «Перезаполнить таблицу товаров…? Существующая таблица будет очищена», сбрасывает Объект.Склад = "", вызывает серверную перенастройку видимости и УправлениеФормой(ЭтаФорма). То же подтверждение — в СкладПриИзменении (стр. 231).
Печатные формы (ManagerModule)
ДобавитьКомандыПечати регистрирует команды с такими представлениями (реальные строки НСтр):
| Идентификатор | Представление в меню «Печать» | Функция-построитель |
|---|---|---|
ИнвентаризацияТоваровНаСкладе |
«Инвентаризация товаров на складе» | ПечатьИнвентаризацияТоваровНаСкладе (стр. 547) |
ИнвентаризацияТоваровНаСкладе_ИНВ10 |
«ИНВ-10 (Инвентаризационная опись запасов)» | ПечатьИНВ10 (стр. 708) |
ИнвентаризацияТоваровНаСкладе_ИНВ18 |
«ИНВ-18 (Сличительная ведомость)» | ПечатьИНВ18 (стр. 1157) |
…,…_ИНВ10,…_ИНВ18 |
«Комплект документов» / «…(на принтер)» / «Настраиваемый комплект документов» | комплект из трёх форм |
Макеты: Templates/ПФ_MXL_ИНВ10, ПФ_MXL_ИНВ18, ПФ_MXL_ИнвентаризацияТоваровНаСкладе. Печать идёт под управлением УправлениеПечатью; функции печати используют ТабДокумент, Макет, Запрос к данным документа.
objects/ называет ИНВ-10 «инвентаризационной описью товарно-материальных ценностей». В реальном коде представление команды — «ИНВ-10 (Инвентаризационная опись запасов)». В тексте и интерфейсе ориентируйтесь на формулировку из кода.Иллюстрация: как расхождения попадут в учёт (НЕ движения этого документа)
Сам документ проводок не делает. Но чтобы партнёр понимал, куда «уходят» отклонения, — типовая картина последующих документов в плане счетов РК (ПланСчетов.Типовой, проверено по ChartsOfAccounts/Типовой/Ext/Predefined.xml):
| Ситуация | Документ-следствие | Дт | Кт |
|---|---|---|---|
| Излишек (факт > учёт) | Оприходование излишков | 1330 «Товары» (или 1310/1320/1350) | 6280 «Прочие доходы» |
| Недостача (факт < учёт), виновный не установлен | Списание недостачи | 7470 «Прочие расходы» | 1330 «Товары» (или 1310/1320/1350) |
| Недостача, отнесена на МОЛ | Списание + претензия | 1280 «Прочая краткосрочная дебиторская задолженность» | 1330 «Товары» |
Счета запасов в конфигурации: 1310 «Сырьё и материалы», 1320 «Готовая продукция», 1330 «Товары», 1350 «Прочие запасы». Это казахстанский план счетов — никаких 10/41/91/94. Конкретный счёт берётся из СчетУчетаБУ строки.
Валидации
Отдельной ОбработкаПроверкиЗаполнения в ObjectModule нет. Контроль складывается из:
- Платформенной обязательности реквизитов
ОрганизацияиВидОперации(ВыдаватьОшибку) при записи. - Формной проверки перед заполнением по остаткам: должны быть заполнены
Организацияи (для вида «По складу»)Склад; иначе — сообщения пользователю иВозврат(см. код выше). - Подтверждений на очистку таблицы при смене вида операции/склада и при повторном заполнении.
Логической проверки «дата окончания ≥ дата начала» и «председатель ровно один» в коде нет — это на совести пользователя.
Зависимости (общие модули)
УчетТоваров (ПолучитьОстаткиТоваров — ядро заполнения), ЗаполнениеДокументов (ЗаполнитьШапкуДокумента), ОбработкаТабличныхЧастейКлиентСервер (расчёт сумм/коэффициентов/отклонений в строках), ДлительныеОперацииКлиент (фоновое заполнение), РаботаСДиалогами/РаботаСДиалогамиКлиент (заголовок формы, выбор подразделения), УправлениеПечатью (печатные формы), ОбщегоНазначения, ПодключаемыеКоманды (версионирование, управление доступом).
- «Не заполняются остатки» / «таблица пустая». Причина почти всегда снаружи документа: (а) не указаны Организация/Склад; (б) на дату документа нет остатков > 0 по счетам ТМЗ с субконто «Склады»; (в) проблема с правами — заполнение идёт под
РАЗРЕШЕННЫЕи в фоновом задании. СмотретьУчетТоваров.ПолучитьОстаткиТоварови настройку счетов учёта номенклатуры, а не модуль документа.- «Где проводки инвентаризации». Их нет и не будет — документ непроводимый по метаданным. Излишки/недостачи проводятся отдельными документами; объясняйте это клиенту сразу.
- Суммы/цены пустые у части строк — нормально для счетов без суммового учёта по складам. Это не ошибка заполнения.
- Печать без подписей — не заполнена табличная часть «Инвентаризационная комиссия».
- Нет смысла искать
ОбработкаПроведения— её нет. Точка расширения для интеграций —ManagerModule(заполнение/печать) и форма, а не проведение.- Заполнение строго асинхронное через временное хранилище. Для пакетной обработки/тестов вызывайте серверные
ЗаполнитьПоОстаткамНаСкладе/…Организации/Перезаполнить…напрямую и читайтеАдресХранилища; не эмулируйте команды формы.- После вставки строк из буфера обмена пересчёт сумм и отклонений не срабатывает автоматически — нужен явный вызов
ОбработкаТабличныхЧастейКлиентСервер(как вТоварыКоличествоПриИзменении).- Хотите автоматически создавать списание/оприходование на основании инвентаризации — это доработка: ни
ОснованиеВвода, ни команды «Создать на основании», ни регистры в типовом объекте не зарегистрированы.
🔗 Связанные разделы
- realizaciya-tmz-i-uslug — расход ТМЗ со склада (формирует те остатки, что инвентаризируем)
- postuplenie-tmz-i-uslug — приход ТМЗ на склад
- nomenklatura — карточка номенклатуры (единица, счёт учёта, штрихкоды)
- sklady — справочник складов (мест хранения)
🆕 Что нового
| Версия | Изменение | Тип |
|---|---|---|
| 3.0.72.1 | Первичное описание (на релизе 3.0.72.1) | 🆕 |