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

11.06.14

Разработка - Механизмы платформы 1С

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

Скачать исходный код

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

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

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

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

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

конфигурация Предприятие 8.3

См. также

Сервисы интеграции без Шины и интеграции

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    3282    dsdred    16    

65

Как готовить и есть массивы

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    7667    YA_418728146    25    

69

Планы обмена VS История данных

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    7885    dsdred    43    

116

1С-ная магия

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    20219    SeiOkami    46    

125

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    14152    human_new    27    

77

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    10512    YA_418728146    7    

149

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    7063    sebekerga    54    

99
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. 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 24.03.16 15:13 Сейчас в теме
Очень полезная штука!
Можете конфигурацию и описание на почту отправить? Буду благодарна.
4. Wafi 01.10.19 14:41 Сейчас в теме
Штука полезная и простая, без лишних ненужных функций. Не могли бы Вы на почту отправить ?
Оставьте свое сообщение