gifts2017

Изучаем 1С Предприятие 8.3 на примере построения простой конфигурации (или как "айтишник" 1С осваивал). Часть 2.

Опубликовал Евгений Руденко (janerev1956) в раздел Программирование - Практика программирования

Пример построения простой конфигурации 1С "Учет движения картриджей для лазерной техники на предприятии" в качестве изучения платформы 1С Предприятие 8.3

В первой части статьи начато построение  конфигурация по учету движения картриджей для лазерной техники на платформе 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 с интерфейсом «Такси» на управляемых формах построена рабочая конфигурация приложения для учета движения картриджей для лазерной техники на предприятии или в организации. Использованы основные стандартные объекты конфигурации. В приложении учитывается движение каждого картриджа – покупка, заправка тонером, восстановление, ремонт , списание. Определяется местонахождения и состояние картриджа в конкретный момент времени. Кроме того учитываются затраты по каждому картриджу (покупка, заправка и пр.) в разрезе поставщиков услуг. Простые отчеты позволяют оценить наличие и состояние картриджей на дату, учесть расходы  и сделать вывод о необходимости покупки картриджей, заправки и пр. 

Проверка конфигурации показала ее работоспособность и возможность практического использования в организации.

Разработанная конфигурация и полная версия статьи доступны для загрузки.

Буду благодарен за любые замечания , пожелания , исправление ошибок, которые несомненно есть.

Скачать файлы

Наименование Файл Версия Размер
учет_картриджей 20
.cf 77,81Kb
11.06.14
20
.cf 1.0 77,81Kb Скачать
Часть2 10
.docx 1,33Mb
11.06.14
10
.docx 1.0 1,33Mb Скачать
Учет картриджей 12
.doc 3,33Mb
18.06.14
12
.doc 1.0 3,33Mb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Natali Yu (crazy.admin91119) 18.12.14 17:02
2. Максим Кузмин (djmix777) 05.08.15 09:32
мдя, не работает конфигурация ваша


скачал конфигурацию

выдаёт при запуске

Платформа: 1С:Предприятие 8.3 (8.3.5.1383)
Конфигурация: Айтишник
Режим: Файловый (без сжатия)
Приложение: Тонкий клиент
Локализация: Информационная база: русский (Россия), Сеанс: русский (Россия)
Вариант интерфейса: Такси

Ошибки:
--------------------------------------------------------------------------------
05.08.2015 11:40:45
{МодульУправляемогоПриложения(6)}: Метод объекта не обнаружен (ДниРожденияСотрудников)
РаботаСДатами.ДниРожденияСотрудников();


При чём тут дни рождения сотрудников? речь о конфигурации по учёту картриджей
3. Elis (elis) 24.03.16 15:13
Очень полезная штука!
Можете конфигурацию и описание на почту отправить? Буду благодарна.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа