Каждый начинающий специалист 1С — будь то консультант, программист или аналитик — рано или поздно сталкивается с ситуацией, вызывающей легкую панику. Пользователи кричат: «Срочно! Документ не проводится! Горит отгрузка!». На экране висит классическая ошибка: «Недостаточно товара с партией N...». При этом на складе товар физически лежит, а в системе управления складом (WMS) он числится в наличии.
В этой статье мы подробно разберем, как перестать паниковать, выработать системный подход к экспресс-диагностике подобных проблем и научиться «читать» бизнес-процессы 1С как открытую книгу.
На практике физическое наличие товара на полке склада и его отражение в WMS-системе не гарантируют успешного списания в финансовом или торговом контуре 1С. Проанализируем основные скрытые причины таких расхождений:
Чтобы оперативно решать проблемы уровня «не проводится документ», рассмотрим эффективный технический алгоритм, который используют опытные специалисты.
Шаг 1. Применяем концепцию «Документ — Регистр — Отчет»
Это фундаментальный закон платформы 1С. Документы сами по себе не хранят остатки — они лишь делают записи (движения) в регистры накопления. Отчеты, в свою очередь, просто собирают и группируют данные из этих регистров. Если отчет показывает неверные данные, значит, какой-то документ сделал неверное движение в регистр. Нам нужно найти этот документ-первоисточник.
Шаг 2. Анализируем движения документов и сравниваем цепочки
Откроем проблемный документ и найдем документ-основание (цепочку ввода). Проанализируем движения приходного документа по регистрам. Для этого на панели навигации документа нажмем кнопку «Движения документа» (или «Результат проведения»). Сравним движения «проблемного» документа с движениями аналогичного «правильного» документа, который провелся без ошибок. Обратим внимание на измерения регистров накопления: организации, склады, серии, партии.
Шаг 3. Используем Универсальный отчет
Вместо того чтобы строить сложные регламентированные отчеты, воспользуемся встроенным инструментом УниверсальныйОтчет. Настроим его напрямую по регистру накопления (например, ПартииТоваровНаСкладах или ТоварыОрганизаций). Добавим группировку по регистратору, складу, серии и организации. Это позволит моментально увидеть, какой именно документ увел остатки в минус или не создал нужную партию.
Шаг 4. Включаем отладку «Остановка по ошибке»
Если система выдает невнятное сообщение или вообще не объясняет причину отказа в проведении, запустим базу в режиме отладки из Конфигуратора. В меню «Отладка» выберем пункт «Настройка отладки» и включим флаг «Останавливаться по ошибке». При попытке провести документ система сама остановит выполнение кода ровно на той строке, которая вызывает сбой. Мы сможем увидеть состояние переменных в этот момент и понять логику отказа.
Для понимания того, как система проверяет остатки, посмотрим на классический пример запроса контроля остатков, который часто выполняется в модуле проведения документов:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПартииТоваровОстатки.Номенклатура КАК Номенклатура,
| ПартииТоваровОстатки.ДокументОприходования КАК Партия,
| ПартииТоваровОстатки.КоличествоОстаток КАК КоличествоОстаток
|ИЗ
| РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&Период, Номенклатура = &Номенклатура) КАК ПартииТоваровОстатки";
Запрос.УстановитьПараметр("Период", Новый Граница(МоментВремени(), ВидГраницы.Включая));
Запрос.УстановитьПараметр("Номенклатура", ВыбраннаяНоменклатура);
РезультатЗапроса = Запрос.Выполнить();
Если этот запрос возвращает пустой результат или количество меньше необходимого, документ выдаст ошибку проведения. Анализ параметров Период (момент времени) и Номенклатура в отладчике — первый ключ к решению проблемы.
Быстро решать задачи «со взгляда» невозможно без понимания общей методологии системы. Вот четыре практических метода, как быстро вырасти до уровня эксперта:
Заведите на предприятии внутреннюю базу знаний (например, на движке Wiki или в обычном общем документе). Как только вы сталкиваетесь с новой уникальной проблемой — решите ее, запишите симптомы, причину и способ устранения. Проставляйте теги. Через пару месяцев у вас накопится уникальный реестр, благодаря которому 80% типовых сбоев вы будете щелкать как орехи за пару минут, а новые сотрудники смогут обучаться в разы быстрее.
Когда вы разобрались с очередной сложной проблемой («поплыла» последовательность, зависли резервы), напишите простой внешний отчет или обработку, которая автоматически проверяет эти условия и выводит ошибки на экран. В следующий раз вам не придется вручную открывать регистры — достаточно будет запустить этот отчет, и он сам укажет на некорректный документ.
Для обхода движений и оперативного поиска расхождений можно использовать простой программный код, который выводит информацию о движениях текущего документа по всем регистрам:
Для Каждого НаборДвижений Из ЭтотОбъект.Движения Цикл
НаборДвижений.Прочитать();
Если НаборДвижений.Количество() > 0 Тогда
Сообщить("Документ делает движения по регистру: " + НаборДвижений.Метаданные().Имя + " (Записей: " + Строка( НаборДвижений.Количество()) + ")");
КонецЕсли;
КонецЦикла;
Никогда не учитесь на «живой» рабочей базе — это огромный стресс и риск испортить учет. Разверните стандартную демонстрационную базу от разработчика (демо-базу вашей конфигурации). Там уже настроены все справочники и введены примеры хозяйственных операций. Намеренно ломайте цепочки документов: распроводите поступления, меняйте склады, резервируйте товары «задним числом». Смотрите, как на это реагирует система, и вы быстро поймете логику ее работы.
Фирма 1С детально описывает логику каждого бизнес-процесса на портале Информационно-технологического сопровождения (ИТС). Изучите разделы, посвященные вашей конфигурации. Понимание того, как именно задумывали этот процесс разработчики 1С, убережет вас от попыток исправить код там, где пользователи просто совершают методологическую ошибку.
Помните: опыт — сын ошибок трудных. Высокая скорость решения проблем приходит исключительно с практикой. Спокойно и кропотливо разбирайте каждый случай, опираясь на логику регистров, и очень скоро паника сменится профессиональным азартом.