При вступлении на путь разработчика 1С часто встречается классическое тестовое задание: создать небольшую систему для складского учета. В этой статье мы разберем, как спроектировать архитектуру такой системы, какие объекты метаданных использовать и ответим на главный вопрос новичков — можно ли обойтись без программирования.
Сразу проясним важный момент: выполнить полноценное задание по оперативному учету без использования встроенного языка 1С невозможно. Хотя платформа предоставляет мощные визуальные инструменты для создания справочников и форм, бизнес-логика (проведение документов, контроль остатков, автоматический расчет цен) описывается строго в программных модулях. Рассмотрим подробнее, где именно потребуется код:
Прежде чем приступать к созданию объектов, проанализируем ситуацию и определим состав метаданных. Для реализации учета товаров и цен нам потребуется стандартный набор объектов:
Справочники:
Номенклатура — для хранения списка товаров.Склады — если учет ведется в разрезе мест хранения.Контрагенты — для поставщиков и покупателей.ВидыЦен — для разделения на закупочные, розничные и т.д.Регистры (сердце системы):
Номенклатура, Склад. Ресурс: Количество.Номенклатура, ВидЦены. Ресурс: Цена.Разберем по шагам, какие документы нам нужны и как они должны влиять на регистры. Для поступления, списания и продажи мы будем использовать механизм проведения.
1. Поступление и оприходование: Эти документы должны делать "Приход" в регистр ОстаткиТоваров. Рассмотрим пример кода в модуле объекта документа:
Процедура ОбработкаПроведения(Отказ, Режим)
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.ОстаткиТоваров.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаТовары.Количество;
КонецЦикла;
КонецПроцедуры
2. Продажа товаров (Реализация): Здесь ситуация сложнее. Нам нужно не только сделать "Расход" по остаткам, но и проверить, хватает ли товара. Выясним причину, почему это важно: без контроля остатков система позволит продать бесконечное количество товара, что приведет к "отрицательным остаткам".
Резервирование — это блокировка товара под конкретного клиента. Проанализируем самый надежный способ реализации этой функции через отдельный документ ЗаказПокупателя.
Заказа создается движение "Приход" в регистр ТоварыВРезерве.Продажи на основании заказа, документ должен делать "Расход" одновременно из ОстаткиТоваров и ТоварыВРезерве.ОстаткиТоваров.Остаток - ТоварыВРезерве.Остаток.Для установки цен создадим документ УстановкаЦен. Он будет записывать данные в периодический регистр сведений. Это позволит нам хранить историю: например, знать, что до понедельника товар стоил 100 рублей, а после — 120.
Чтобы цена автоматически подставлялась в документ продажи при выборе товара, в модуле формы документа Реализация в событии ПриИзменении для поля Номенклатура нужно прописать получение актуальной цены:
&НаСервере
Функция ПолучитьАктуальнуюЦену(АктуальнаяДата, ВыбраннаяНоменклатура, ВыбранныйВидЦены)
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Номенклатура", ВыбраннаяНоменклатура);
ПараметрыОтбора.Вставить("ВидЦены", ВыбранныйВидЦены);
ЗначенияРесурсов = РегистрыСведений.ЦеныНоменклатуры.СрезПоследних(АктуальнаяДата, ПараметрыОтбора);
Если ЗначенияРесурсов.Количество() > 0 Тогда
Возврат ЗначенияРесурсов[0].Цена;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
Система компоновки данных (СКД) позволяет создавать сложные отчеты практически без программирования, используя визуальный конструктор запросов. Разберем создание основных отчетов:
Ведомость по товарам: Используем виртуальную таблицу ОстаткиИОбороты регистра ОстаткиТоваров. Она автоматически предоставит поля: НачальныйОстаток, Приход, Расход и КонечныйОстаток. Вам останется только вывести их в настройки отчета.
Остатки и доступность: В конструкторе запроса нужно соединить две таблицы: ОстаткиТоваров.Остатки и ТоварыВРезерве.Остатки. Соединение выполняется по полю Номенклатура (Левое соединение, чтобы видеть даже те товары, на которые нет резерва). Поле "Доступно" рассчитывается в самом запросе как разность ресурсов двух таблиц.
Прайс-лист: Здесь мы обращаемся к таблице ЦеныНоменклатуры.СрезПоследних. Это гарантирует, что в отчет попадут только самые свежие цены на дату формирования отчета.
Рассмотрим несколько нюансов, которые покажут ваш профессионализм:
Для Каждого. Это грубая ошибка. Сначала соберите все данные в массив, а потом одним запросом получите результат.Модуле объекта. В Модуле формы должна быть только логика интерфейса.Док1 пишите ПоступлениеТоваров.Спроектировав систему таким образом, вы продемонстрируете знание базовых принципов платформы 1С: понимание работы регистров, механизмов проведения и системы компоновки данных. Несмотря на то, что задание кажется простым, дьявол кроется в деталях реализации контроля остатков и правильном соединении таблиц в отчетах.