Изучаем 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

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4431    dsdred    53    

69

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

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

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

24.01.2024    5271    YA_418728146    25    

62

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

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

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

11.12.2023    6389    dsdred    36    

111

1С-ная магия

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

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

06.10.2023    18463    SeiOkami    46    

118

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

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

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

14.09.2023    12073    human_new    27    

74

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

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

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

28.08.2023    8799    YA_418728146    6    

141

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

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

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

20.08.2023    6271    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

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

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15959    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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 Сейчас в теме
Штука полезная и простая, без лишних ненужных функций. Не могли бы Вы на почту отправить ?
Оставьте свое сообщение