В первой части статьи начато построение конфигурация по учету движения картриджей для лазерной техники на платформе 1С Предприятие 8.3 (ссылка на Часть.1) с использованием интерфейса «Такси». Созданы основные объекты конфигурации для предполагаемого алгоритма работы программы: справочники Картриджи, Принтеры, Поставщики, регистр накоплений КартриджиОплата , регистр сведений КартриджиЗамена и документы ПоступлениеКартриджей , ЗаменаКартриджа. Добавлен некоторый код для обработки проведения документов. Проведена успешная проверка программы на работоспособность.
Остались вопросы доработка функциональности, добавление отчетов, исправление ошибок и отладка . Этим и займемся. Для удобства работы добавим справочник Сотрудники (Рис . 25).
Теперь можно исправить тип соответствующих реквизитов в справочнике Принтеры (ВладелецТехники) и в документе ЗаменаКартриджа (ЗаменаКтоДелал) поставив в реквизитах ссылку на заведенный справочник.
Добавим в конфигурацию новый документ СписаниеКартриджа (Рис.26).
Для заполнения поля документа ПричинаСписания добавим в конфигурацию еще одно перечисление ПричинаСписанияКартриджа (Устарел,Сломан,Прочее). Движение по документу для порядка будем записывать в регистр накопления КартриджиОплата (хотя это и не оплата!). В справочник Картриджи добавим еще один реквизит ДатаСписания.
В процедуре обработки проведения документа (в модуле объекта) допишем код для изменения состояния текущего картриджа в справочнике Картриджи :
Процедура ОбработкаПроведения(Отказ, Режим)
Картриджи = Справочники.Картриджи;
// регистр КартриджиОплата Расход
Движения.КартриджиОплата.Записывать = Истина;
Движение = Движения.КартриджиОплата.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.НоменклатураКартриджей = НоменклатураКартриджа;
Движение.НомерКартриджа = НомерКартриджа;
Движение.СостояниеКартриджа = ПричинаСписания;
Движение.СчетДата = ДатаСписания;
// меняем состояние текущего картриджа
СтрокаНомерКартриджа = НомерКартриджа;
НайденнаяСсылка = Картриджи.НайтиПоРеквизиту("Номер",СтрокаНомерКартриджа);
Если НЕ НайденнаяСсылка = Картриджи.ПустаяСсылка()
тогда ТекущийОбъект =
Картриджи.НайтиПоРеквизиту("Номер", СтрокаНомерКартриджа).ПолучитьОбъект();
ТекущийОбъект.МестоНахождения = "Списан";
ТекущийОбъект.Состояние = "Списан";
ТекущийОбъект.ДатаСписания = ДатаСписания;
ТекущийОбъект.Записать();
КонецЕсли;
КонецПроцедуры
Доработаем документ ПоступлениеКартриджей. Напомню, что этим документом , осуществляется как покупка картриджей, так и прием на склад заправленных, восстановленных и отремонтированных картриджей (поскольку все работы выполняет сторонняя организация (поставщик)).
Во-первых, исправим в табличной части НоменклатураДокумента наименование реквизита СостояниеКартриджа на ВидРабот (что более понятно по смыслу) и установим тип этого реквизита в ссылку на новое перечисление ВидРабот (Покупка,Заправка,Восстановление,Ремонт,Списание).
Во-вторых,сделаем так, чтобы в документе автоматически выбиралась последняя по дате цена (покупки, заправки и пр.) при заполнении поля Поставщик (при заполненном поле ТипКартриджа и ВидРабот). Ранее для хранения цен был создан справочник НоменклатураКартриджейЦены, однако , с точки зрения 1С , хранить цены в справочниках некорректно. Поэтому этот справочник из нашей конфигурации удалим, а создадим регистр сведений с тем же именем НоменклатураКартриджейЦены с измерениями, ресурсами и реквизитами как показано на (Рис.27).
Выберем Независимый режим записи в регистр. Поскольку метод ПолучитьПоследнее() , который мы собираемся использовать, работает только для периодических регистров, параметр Периодичность регистра установим В пределах секунды.
В режиме Предприятие занесем в этот регистр вручную несколько строк для разных поставщиков и типов картриджей (ну как-то так, как на Рис.28).
В конфигураторе заходим в форму документа ПоступлениеКартриджей (а форма у нас создана) и для поля формы НоменклатураДокументаВидРабот в его свойствах создадим обработку для события ПриИзменении (Рис.29_1) .
В модуле формы документа появится шаблон процедуры НоменклатураДокументаВидРаботПриИзменении(). Наполним эту процедуру содержанием - добавим следующий код (Рис.29):
В такой конфигурации при проведении документа выбираются последние цены по виду работы и типу картриджа для выбранного поставщика.
Доработаем справочник Картриджи – сделаем его удобным для работы и покрасивее.
В конфигураторе сделаем справочник иерархическим. В режиме Предприятия в форме справочника выбираем пункт Настроить список и в режиме условного оформления раскрашиваем строки в зависимости от значения реквизитов Состояние и МестоНахождение. В пункте формы Изменить форму убираем видимость у поля Код. Вот что получилось (Рис.30)
Следует отметить, что данные настройки списка сохраняются только для текущего пользователя (а ролей то у нас пока и нет).
Попробуем сделать простенький отчет о наличии и состоянии картриджей. Что нам надо – это вывести список картриджей с группировкой по типу и указанием состояния и местоположения каждого картриджа на текущую дату. Дату отчета естественно надо указать в заголовке. Будем использовать СКД (систему компоновки данных) стандартным образом, то есть сделаем всё с помощью конструктора без написания какого-либо кода (Рис.31)
Вот что получилось (Рис.32).
Отвлечемся пока от картриджей и попробуем немного «оживить» программу. При этом одновременно потренируемся в написании программного кода.
Пусть при запуске программа напоминает нам о предстоящих днях рождения сотрудников! Будем использовать значение реквизита ДатаРождения справочника Сотрудники и сравнивать это значение с текущей датой при запуске программы. Создадим в дереве конфигурации общий модуль и назовем его РаботаСДатами. В свойствах модуля поставим галку Клиент (управляемое приложение). В модуле напишем экспортную процедуру ДниРожденияСотрудников :
Процедура ДниРожденияСотрудников () Экспорт
ТекстДР = "";
ТекстДРЗавтра = "";
ТекстДРПослезавтра = "";
ТекущийСправочник = Справочники.Сотрудники;
ДатаЗавтра = РаботаСДатами.ДатаЗавтра();
ДатаПослеЗавтра = РаботаСДатами.ДатаПослеЗавтра();
Именинники = Новый СписокЗначений;
ИменинникиЗавтра = Новый СписокЗначений;
ИменинникиПослеЗавтра = Новый СписокЗначений;
Выборка = ТекущийСправочник.Выбрать();
Пока Выборка.Следующий()
Цикл ТекЭлем = Выборка.ПолучитьОбъект();
// Сегодня
Если ( (День(ТекЭлем.ДатаРождения) = День(ТекущаяДата()))
И (Месяц(ТекЭлем.ДатаРождения) = Месяц(ТекущаяДата())))
Тогда Именинники.Добавить(ТекЭлем);
КонецЕсли;
// Завтра
Если ( (День(ТекЭлем.ДатаРождения) = День(ДатаЗавтра))
И (Месяц(ТекЭлем.ДатаРождения) = Месяц(ДатаЗавтра)))
Тогда ИменинникиЗавтра.Добавить(ТекЭлем);
КонецЕсли;
// ПослеЗавтра
Если ( (День(ТекЭлем.ДатаРождения) = День(ДатаПослеЗавтра))
И (Месяц(ТекЭлем.ДатаРождения) = Месяц(ДатаПослеЗавтра)))
Тогда ИменинникиПослеЗавтра.Добавить(ТекЭлем);
КонецЕсли;
КонецЦикла;
// Сегодня
Если Именинники.Количество() > 0
Тогда Для Каждого ЭлементСписка Из Именинники
Цикл Коллега = ЭлементСписка.Значение;
ТекстДР = ТекстДР + "Сегодня наш коллега " + Коллега +
" отмечает свой День Рождения ! " + Символы.ПС;
КонецЦикла;
Иначе ТекстДР = "Сегодня ИМЕНИННИКОВ НЕТ !!!!";
КонецЕсли;
Сообщить(ТекстДР);
// Завтра
Если ИменинникиЗавтра.Количество() > 0
Тогда Для Каждого ЭлементСписка Из ИменинникиЗавтра
Цикл Коллега = ЭлементСписка.Значение;
ТекстДРЗавтра = ТекстДРЗавтра + "Завтра наш коллега " + Коллега +
" будет отмечать свой День Рождения ! " + Символы.ПС;
КонецЦикла;
Иначе ТекстДРЗавтра = "Завтра ИМЕНИННИКОВ НЕТ !!!!";
КонецЕсли;
Сообщить(ТекстДРЗавтра);
// Послезавтра
Если ИменинникиПослеЗавтра.Количество() > 0
Тогда Для Каждого ЭлементСписка Из ИменинникиПослеЗавтра
Цикл Коллега = ЭлементСписка.Значение;
ТекстДРПослеЗавтра = ТекстДРПослеЗавтра + "Послезавтра наш коллега " + Коллега +
" будет отмечать свой День Рождения ! " + Символы.ПС;
КонецЦикла;
Иначе ТекстДРПослеЗавтра = "Послезавтра ИМЕНИННИКОВ НЕТ !!!!";
КонецЕсли;
Сообщить(ТекстДРПослеЗавтра);
КонецПроцедуры
Функция ДатаЗавтра() Экспорт
Завтра = ТекущаяДата()+ 60*60*24;
ВОЗВРАТ Завтра;
КонецФункции
Функция ДатаПослеЗавтра() Экспорт
ПослеЗавтра = ТекущаяДата()+ 2*60*60*24;
ВОЗВРАТ ПослеЗавтра;
КонецФункции
Чтобы это все работало надо открыть в дереве конфигурации модуль управляемого приложения и в нем прописать написанную нами процедуру:
&НаКлиенте
Процедура ПриНачалеРаботыСистемы ()
ПерейтиПоНавигационнойСсылке("e1cib/list/Справочник.Картриджи");
Сообщить("Вы работаете в программе Учет картриджей !!!", СтатусСообщения.Важное);
РаботаСДатами.ДниРожденияСотрудников();
КонецПроцедуры
Первая строчка в процедуре открывает на рабочем столе справочник Картриджи при запуске программы. Сообщения выводятся внизу рабочего стола. Вот как выглядит теперь рабочий стол программы при запуске ( Рис.33)
Проведем еще одну доработку справочника Картриджи – а именно, поработаем с формой списка картриджей и добавим на неё кнопку, при нажатии на которую будет фильтроваться список и выбираться только новые картриджи (у которых реквизит Состояние имеет значение «Новый»). Назовем кнопку ТолькоНовые, разместим ее в Командной панели формы. Предварительно в панели команд формы добавим команду ОтборНовых и в свойствах кнопки в поле ИмяКоманды пропишем эту команду (Рис.34)
В модуле формы списка заполним процедуру ОтборНовых следующим кодом (Рис.35):
В режиме Предприятия смотрим получившийся вид списка – при нажатии на кнопку Только новые отбираются только новые картриджи (Рис.36):
Сделаем еще один простой отчет для подсчета расходов на покупку, заправку и прочие работы по картриджам. Опять же будем использовать СКД стандартным способом. В качестве Набора данных возмем регистр накоплений КартриджиОплата, вид отчета – Запрос (Рис.37).
Используем группировку по полям НоменклатураКартриджей и ВидРабот. В закладке Ресурсы укажем Сумму() по полю Сумма. В «детальных записях» будем отбирать записи по виду работ и периоду (Рис.38).
Добавим возможность пользователю выбирать начальную и конечную даты периода оплаты работ.
Для этого введем два параметра : ПериодНачало и ПериодКонец. Будут отбираться документы , оплаченные в даты , попадающие в данный диапазон. Результат работы отчета показан на рисунке (Рис.39):
На этом пока закончим и приступим к использованию разработанной конфигурации.
Заключение.
В процессе изучения платформы 1С Предприятие 8.3 с интерфейсом «Такси» на управляемых формах построена рабочая конфигурация приложения для учета движения картриджей для лазерной техники на предприятии или в организации. Использованы основные стандартные объекты конфигурации. В приложении учитывается движение каждого картриджа – покупка, заправка тонером, восстановление, ремонт , списание. Определяется местонахождения и состояние картриджа в конкретный момент времени. Кроме того учитываются затраты по каждому картриджу (покупка, заправка и пр.) в разрезе поставщиков услуг. Простые отчеты позволяют оценить наличие и состояние картриджей на дату, учесть расходы и сделать вывод о необходимости покупки картриджей, заправки и пр.
Проверка конфигурации показала ее работоспособность и возможность практического использования в организации.
Разработанная конфигурация и полная версия статьи доступны для загрузки.
Буду благодарен за любые замечания , пожелания , исправление ошибок, которые несомненно есть.