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