Построена простая конфигурация учета движения картриджей для лазерной техники в организации с использованием платформы 1С Предприятие 8.3 и интерфейса "Такси". Учитывается движение каждого картриджа (покупка, заправка, восстановление, ремонт, установка в принтер и пр.) и расход средств по каждому картриджу. Основная цель - освоить разработку приложений на базе платформы 1С Предприятие 8.3 на примере построения работоспособного и полезного приложения.
Я программист со стажем, но 1С серьезно раньше не занимался . Чтобы совместить приятное (знакомство с 1С Предприятие 8.3 ) с полезным (работу никто не отменял) попробуем построить работоспособную конфигурацию с использованием возможностей новой версии . Может быть процесс разработки конфигурации будет для кого-то полезным и поможет начинающим освоить 1С.
Работаю в отделе IT крупной организации с большим количеством лазерных принтеров и МФУ. Учет движения картриджей для них является актуальной задачей и требованием руководства.
Постановка задачи.
Заправка тонером, восстановление, ремонт картриджей осуществляется сторонней организацией. Необходимо учитывать движение каждого картриджа , то есть покупку, заправку тонером , восстановление, ремонт, установку в конкретный принтер (МФУ), текущее местоположение, списание и пр. Кроме того надо учитывать затраты по каждому картриджу (расходы на покупку , заправку тонером и пр. в разрезе поставщиков).
Понятное дело - нужны какие-то отчеты . Само собой для юзеров все должно быть как можно проще и понятней.
План реализации.
Используем платформу 1С Предприятие 8.3 как самую современную на текущий момент.
Для освоения платформы постараемся использовать как можно больше различных объектов конфигурации и , естественно, новый интерфейс «Такси» . Постараемся давать объектам понятные и близкие к функциональному назначению имена. Не будем пока касаться «тонких» моментов работы 1С , как-то оптимизация клиент-серверного взаимодействия, распределения ролей и пр.
Предположим для начала, что в нашей конфигурации будут следующие объекты :
Справочники :
НоменклатураКартриджей
Картриджи
НоменклатураКартриджейЦены
Принтеры
Номенклатура Принтеров
Поставщики
Документы :
ПоступлениеКартриджей
ЗаменаКартриджа
СписаниеКартриджей
Перечисления:
ДаНет
СостояниеКартриджей
ПричиныЗаменыКартриджей
Регистры сведений :
КартриджиЗамена
Регистры накоплений :
КартриджиОплата
Алгоритм работы.
Основным «действующим лицом» является список имеющихся картриджей (Справочник Картриджи). Изначально список заполняется документом ПоступлениеКартриджей. Тип картриджей определяется по справочнику НоменклатураКартриджей. При покупке картриджа значение реквизит Состояние в документе выбирается как Новый. Цена покупки определяется по справочнику НоменклатураКартриджейЦены на текущую дату . Уникальность картриджа определяется его серийным номером (реквизит СерийныйНомер). Реквизит Местоположение определяется как «Склад».
Учет заправок, восстановления, ремонта и пр. существующих уже картриджей осуществляется также документом ПоступлениеКартриджей. Тип картриджей определяется по справочнику НоменклатураКартриджей. Состояние картриджа определяется из перечисления СостояниеКартриджей. Цена работы (заправка, восстановление) определяется по справочнику НоменклатураКартриджейЦены. Уникальность картриджа определяется его серийным номером (реквизит СерийныйНомер).
При проведении документа ПоступлениеКартриджей в табличную часть ЗаменаКартриджей справочника Картриджи добавляется строка с реквизитами текущего документа и у соответствующих картриджей (с серийным номером из документа) в справочнике Картриджи меняется значение реквизитов Состояние и Местоположение.
Кроме того, в регистр накоплений КартриджиОплата заносится движение по данному документу.
Учет замены картриджа в конкретном принтере (справочник Принтеры) осуществляется документом ЗаменаКартриджа. В документе указывается текущий принтер. Уникальность принтера определяется реквизитом СерийныйНомер. Указывается устанавливаемый и заменяемый картридж (серийные номера картриджей).
При проведении документа ЗаменаКартриджа в табличной части справочника Принтеры у текущего принтера добавляется строка с реквизитами документа и изменяется реквизит Картридж. В справочнике Картриджи у текущих картриджей меняется значение реквизитов Состояние и Местоположение. Для установленного картриджа в реквизите Местоположение прописывается текущий принтер, а у снятого картриджа - «Склад».
Кроме того, в регистр КартриджиЗамена заносится движение по данному документу.
Списание картриджей осуществляется отдельным документом СписаниеКартриджей.
Таким образом , в текущий момент времени в справочнике Картриджи каждый картридж имеет вполне определенное состояние (новый, заправленный, пустой и пр.) и определенное местоположение («Склад» или конкретный принтер), что путем несложных отчетов позволяет оценить наличие картриджей с заданным состоянием и сделать вывод о необходимости покупки, заправки и пр. Ну и учесть расходы естественно.
Реализация.
Приступим собственно к конфигурированию.
Создадим пустую базу в конфигураторе, назовем ее гордо «Айтишник» и организуем подсистему Учет картриджей. Не буду описывать по шагам, как это сделать, поскольку по данному вопросу книг хватает.
Сначала добавим перечисления : ДаНет, СостояниеКартриджей и ПричиныЗаменыКартриджей , которые нам понадобятся в дальнейшем. Состав перечислений виден на Рис.2
Сконфигурируем простые справочники НоменклатураКартриджей и НоменклатураПринтеров.
Реквизиту ТипКартриджа в справочнике НоменклатураПринтеров присвоим тип ссылка на справочник НоменклатураКартриджей ( Рис.3 ). Не забываем, что все сформированные нами объекты конфигурации надо включить в состав подсистемы УчетКартриджей.
Далее заведем справочник Поставщики (Рис.4) и справочник Принтеры (Рис.5). Отметим, что справочник Принтеры кроме реквизитов имеет еще и табличную часть ЗаменаКартриджей.
В справочнике Принтеры несколько реквизитов имеют тип ссылки :
ТипКартриджа – СправочникСсылка.НоменклатураКартриджей
Поставщик – СправочникСсылка.Поставщики
Состояние - ПеречислениеСсылка.СостояниеКартриджей.
Далее заведем справочник НоменклатураКартриджейЦены и собственно основной наш справочник Картриджи (Рис.6).
Для дальнейшего тестирования программы заполним в режиме Предприятие по нескольку строк в открытых нами справочниках. Естественно, сначала заполняем простые справочники, потом – справочники с реквизитами ссылками. В дальнейшем загрузку полных реальных данных предприятия предполагается осуществить с помощью обработки Загрузка табличных документов из таблиц Excel.
Теперь настала пора добавления в конфигурацию документов. Сконфигурируем в дереве объектов конфигурации объект документ ПоступлениеКартриджей с реквизитами и табличной частью НоменклатураДокумента . Регистров накопления у нас в конфигурации пока нет – закладка Движение для документа остается пустой. Поскольку нам надо будет писать свою обработку документа , а пишется программный код в модуле формы документа, то и создадим эту самую форму (Рис.9). Делаем все по умолчанию, как написано в книжках (Форма – Добавить – ФормаДокумента).
Использовать данный документ будем при поступлении на склад как новых , так и заправленных (восстановленных, отремонтированных) картриджей.
Наконец, для учета поступления картриджей заводим регистр накопления КартриджиОплата с измерениями, ресурсами и реквизитами (Рис.10).
В закладке Регистраторы указываем наш документ ПоступлениеКартриджей. Сохраняем конфигурацию.
Возвращаемся по дереву объектов в документ ПоступлениеКартриджей. На закладке Движение выбираем регистр КартриджиОплата, запускаем Конструктор движений и заполняем поле Выражение значениями реквизитов документа (Рис.11).
Жмем ОК и попадаем в Модуль объекта документа , где и видим уже созданный Конструктором движения регистров программный код (Рис.12).
Теперь самое интересное – надо добавить в Модуль объекта программный код, для обеспечения следующего функционала при проведении документа ПоступлениеКартриджей.
При поступлении нового картриджа (покупка) в справочнике Картриджи должна добавляться строка с уникальным номером картриджа и соответствующими (из документа) реквизитами. При этом реквизит СостояниеКартриджа будет иметь значение «Новый» , а реквизит Местоположение – значение «Склад». Табличная часть справочника Картриджи при этом не заполняется.
По алгоритму работы программы изначально надо занести каждый картридж со своим уникальным номером в справочник Картриджи документом ПоступлениеКартриджей.
При поступлении заправленного тонером (восстановленного, отремонтированного и пр.) картриджа считается , что картридж с таким номером уже есть в справочнике Картриджи, и в этом случае при проведении документа ПоступлениеКартриджей, добавляется строка в Табличную часть Заправки и меняются значения реквизитов Местонахождение и Состояние у текущего картриджа. Добавленный в Модуль объекта код показан на Рис.13.
Теперь можно провести первую пробу работоспособности программы. В Предприятие создаем документ ПоступлениеКартриджей (Рис.14). Нажимаем кнопку Провести и закрыть. Переходим в справочник Картриджи и видим , что в нем появилась строчка с реквизитами купленного картриджа с пустой табличной частью(Рис.15).
Откроем регистр КартриджиОплата (пункт в меню Регистр оплаты картриджей) и увидим там аналогичную строку.
Создаем и проводим второй документ ПоступлениеКартриджей с тем же картриджем, но заправленным (Рис.16).
Переходим в справочник Картриджи и видим , что у заведенного нами картриджа добавилась строчка в табличной части Заправки и изменился реквизит Состояние (Рис.17).
Ура! Программа работает!
Конечно функциональность документа ПоступлениеКартриджей надо доработать, например, хотелось бы, чтобы автоматически подставлялась последняя по дате цена услуги в поле Стоимость документа из справочника НоменклатураКартриджейЦены при выборе поставщика и для данного типа картриджа.
Это будет позднее, а сейчас займемся заменой картриджей – создадим документ ЗаменаКартриджа и соответствующий регистр сведений КартриджиЗамена.
Реквизиты и табличная часть документа НоменклатураДокумента показаны на Рис.18. Подходящих регистров накопления и сведений у нас в конфигурации пока нет , в закладка Движение для документа не будем ничего отмечать. Поскольку нам надо будет писать свою обработку документа , то создаем ФормуДокумента по умолчанию.
Для учета замены картриджей заводим для разнообразия регистр сведений (не регистр накоплений) КартриджиЗамена с измерениями и реквизитами (Рис.19). Получилось пока без ресурсов как-то.
В закладке Регистраторы указываем наш документ ЗаменаКартриджа .
Сохраняем конфигурацию. Возвращаемся по дереву объектов в документ ЗаменаКартриджа. На закладке Движение выбираем регистр КартриджиЗамена, запускаем Конструктор движений и заполняем поле Выражение значениями реквизитов документа. Жмем ОК и попадаем в Модуль объекта документа , где и видим уже созданный Конструктором движения регистров программный код (Рис.20).
Теперь добавляем в Модуль объекта программный код, для обеспечения следующего функционала при проведении документа ЗаменаКартриджа. В справочнике Принтеры для принтера , у которого заменяется картридж должна добавиться строка в табличной части ЗаменаКартриджей со значениями реквизитов из документа и изменится значение реквизита НомерКартриджаСейчас. В справочнике Картриджи у снятого и установленного картриджей изменятся значения реквизитов Местоположение и Состояние . Доработанная процедура обработки проведения документа ЗаменаКартриджа показана ниже.
Процедура ОбработкаПроведения(Отказ, Режим)
// используемые справочники
Принтеры = Справочники.Принтеры;
Картриджи = Справочники.Картриджи;
// конец вставки используемые справочники
// регистр КартриджиЗамена
Движения.КартриджиЗамена.Записывать = Истина;
Для Каждого ТекСтрокаНоменклатураДокумента Из НоменклатураДокумента Цикл
Движение = Движения.КартриджиЗамена.Добавить();
Движение.НоменклатураКартриджей = НоменклатураКартриджа;
Движение.СнятКартриджНомер = ТекСтрокаНоменклатураДокумента.СнятКартриджНомер;
Движение.УстановленКартриджНомер=
ТекСтрокаНоменклатураДокумента.УстановленКартриджНомер;
Движение.МодельПринтера = МодельПринтера;
Движение.ПринтерСерийныйНомер = ТекСтрокаНоменклатураДокумента.ПринтерСерийныйНомер;
Движение.ПринтерИнвентарныйНомер =
ТекСтрокаНоменклатураДокумента.ПринтерИнвентарныйНомер;
Движение.ТипКартриджа = ТекСтрокаНоменклатураДокумента.ТипКартриджа;
Движение.ЗаменаКтоДелал = ЗаменаКтоДелал;
Движение.ПричинаЗамены = ТекСтрокаНоменклатураДокумента.ПричинаЗамены;
// изменяем справочник Принтеры
СтрокаНаименования = ТекСтрокаНоменклатураДокумента.ПринтерСерийныйНомер;
НайденнаяСсылка = Принтеры.НайтиПоРеквизиту("СерийныйНомер",СтрокаНаименования);
Если НЕ НайденнаяСсылка = Принтеры.ПустаяСсылка()
Тогда ТекущийОбъект =
Принтеры.НайтиПоРеквизиту("СерийныйНомер",СтрокаНаименования).ПолучитьОбъект();
ТекущийОбъект.НомерКартриджаСейчас =
ТекСтрокаНоменклатураДокумента.УстановленКартриджНомер;
НоваяСтрока = ТекущийОбъект.ЗаменаКартриджей.Добавить();
НоваяСтрока.ДатаЗамены = Дата;
НоваяСтрока.ВидКартриджа = ТекСтрокаНоменклатураДокумента.ТипКартриджа;
НоваяСтрока.НомерУстановленногоКартриджа =
ТекСтрокаНоменклатураДокумента.УстановленКартриджНомер;
НоваяСтрока.НомерСнятогоКартриджа =
ТекСтрокаНоменклатураДокумента.СнятКартриджНомер;
НоваяСтрока.КтоЗаменил = ЗаменаКтоДелал;
НоваяСтрока.ПричинаЗамены = ТекСтрокаНоменклатураДокумента.ПричинаЗамены;
ТекущийОбъект.Записать();
КонецЕсли;
// изменяем справочник Картриджи - установленный картридж
СтрокаНаименования = ТекСтрокаНоменклатураДокумента.УстановленКартриджНомер;
НайденнаяСсылка = Картриджи.НайтиПоРеквизиту("Номер",СтрокаНаименования);
Если НЕ НайденнаяСсылка = Картриджи.ПустаяСсылка()
тогда ТекущийОбъект =
Картриджи.НайтиПоРеквизиту("Номер",СтрокаНаименования).ПолучитьОбъект();
Строка = " ";
Строка = Строка + МодельПринтера + " " +
ТекСтрокаНоменклатураДокумента.ПринтерСерийныйНомер + " " +
ТекСтрокаНоменклатураДокумента.ПринтерИнвентарныйНомер;
ТекущийОбъект.МестоНахождения = Строка;
ТекущийОбъект.Записать();
КонецЕсли;
// снятый картридж
СтрокаНаименования = ТекСтрокаНоменклатураДокумента.СнятКартриджНомер;
НайденнаяСсылка = Картриджи.НайтиПоРеквизиту("Номер",СтрокаНаименования);
Если НЕ НайденнаяСсылка = Картриджи.ПустаяСсылка()
тогда ТекущийОбъект =
Картриджи.НайтиПоРеквизиту("Номер",СтрокаНаименования).ПолучитьОбъект();
ТекущийОбъект.МестоНахождения = "Склад";
ТекущийОбъект.Состояние = Перечисления.СостояниеКартриджа.Пустой;
ТекущийОбъект.Записать();
КонецЕсли;
// конец изменения справочников
КонецЦикла;
КонецПроцедуры;
Для проверки заполняем и проводим документ ЗаменаКартриджа (Рис.21) . Заходим в справочник Принтеры и видим , что у выбранного принтера добавилась строка в табличную часть Заправки с реквизитами проведенного нами документа и реквизит НомерКартриджаСейчас принял значение номера установленного картриджа (Рис.22).
В справочнике Картриджи у картриджа , установленного в принтер, в реквизит Местоположение записались данные текущего принтера (Рис.23) . И кроме того в регистр сведений КартриджиЗамена записалось движение по документу (Рис.24)
Таким образом на данный момент получилась конфигурация по учету движения картриджей для лазерной техники, которую в принципе уже можно использовать в работе.
С точки зрения «идеологии» 1С наверно неправильно изменять реквизиты справочников проведением документов, использовать справочник для хранения текущих цен - тут сказывается предыдущий опыт работы с таблицами автора статьи, а чем справочник не таблица?
Естественно требуется доработка функциональности, добавление отчетов, исправление ошибок и отладка . Об этом в следующей части статьи.
Полная версия статьи приведена в файле Часть1.doc