Список работ

Комплектация изделий

Курсовая работа по дисциплине Программная инженерия

Нечипоренко С. Ю., А-13-13

Содержание

Постановка задачи

Разрабатывается на платформе 1С8:Предприятие приложение "Комплектация изделий", позволяющее фиксировать состав сборочной единицы (узла или конечного изделия). В общем случае узел может включать прочие узлы, детали, материалы и стандартные изделия, такие, как, гайки, шайбы и пр.
Для хранения сведений о компонентах узла создается справочник "Изделия" с группами "Детали" и "Узлы". Состав узла определяется в документе "Комплектация", движения которого фиксируются регистром сведений "КомплектацияУзлов".
По данным этого регистра формируется отчет "Состав изделия (узла)".

Объекты конфигурации

Формы элемента и списка справочника Изделия приведены на рис. 1 и 2.

Рисунок формы элемента справочника Изделия

Рис. 1. Форма элемента справочника Изделия

Рисунок формы списка справочника Изделия

Рис. 2. Форма списка справочника Изделия

Справочник имеет следующие реквизиты:

В справочнике 2 уровня. На первом - имена групп изделий, на втором - сведения об изделиях. В группу Узлы заносятся данные о конечных изделиях и прочих узлах. В группе Детали хранятся сведения о деталях и стандарных изделиях.
Форма документа Комплектация и форма списка документа приведены на рис. 3 и 4.

Рисунок формы документа Комплектация

Рис. 3. Форма документа Комплектация

Рисунок формы списка документа Комплектация

Рис. 4. Форма списка документа Комплектация

Документ имеет табличную часть КомпонентыУзла и следующие реквизиты:

Табличная часть КомпонентыУзла имеет следующие реквизиты:

Движения документа фиксируются регистром сведений "КомплектацияУзлов" посредством следующей ОбработкиПроведения документа Комплектация:

Процедура ОбработкаПроведения(Отказ, Режим)
 // Регистр КомплектацияУзлов
 Движения.КомплектацияУзлов.Записывать = Истина;
 Движения.КомплектацияУзлов.Очистить();
 Для Каждого ТекСтрокаКомпонентыУзла Из КомпонентыУзла Цикл
  Движение = Движения.КомплектацияУзлов.Добавить();
  Движение.Узел = Узел;
  Движение.КомпонентУзла = ТекСтрокаКомпонентыУзла.КомпонентУзла;
  Движение.Вариант = Вариант;
  Движение.Количество = ТекСтрокаКомпонентыУзла.Количество;
 КонецЦикла;
КонецПроцедуры

Несколько записей регистра КомплектацияУзлов показаны на рис. 5.

Несколько записей регистра Комплектация узлов

Рис. 5. Список Комплектация узлов

Отчет Состав изделия

В форме отчета (рис. 6) выбирается конечное изделие или узел (сборочная единица).

Форма отчета Состав изделия

Рис. 6. Отчет Состав изделия

Результат выводится в лист Excel (рис. 7).

Результат отчета Состав изделия

Рис. 7. Состав изделия Двигатель

Ячейка с наименованием узла, состав которого выводится, заливается желтым цветом. Ячейки с наименованиями подчиненных узлов заливаются зеленым цветом. Наименования деталей и стандартных изделий выводятся на белом фоне.
Для заливки используется свойство Interior.ColorIndex. По умолчанию ColorIndex берется из приведенной на рис. 8 цветовой палитры.

Рисунок Цветовой палитры ColorIndex

Рис. 8. Цветовая палитра для выбора ColorIndex

В отчете реализуется следующий алгоритм (проверки опускаются):

  1. Получить комплектующие указанного узла, использовав следующий запрос к регистру сведений Комплектация узлов:
      запрос.Текст = "выбрать узел, компонентУзла, количество
      | из регистрСведений.КомплектацияУзлов где узел = &узел";
  2. Выгрузить результат в таблицу значений ТЗ. Первоначально в таблице будут 3 столбца с именами Узел, КомпонентУзла и Количество (рис. 8).
    Рисунок начальной таблицы значений

    Рис. 9. Начальная таблица значений в отчете Состав изделия

  3. Выгрузить столбец КомпонентУзла в массив М.
  4. Положить, что добавитьСтолбцы = истина.
  5. Перебирать элементы массива М.
  6. Если элемент - это узел, то выбрать его комлектующие.
    1. Перебирать результаты запроса.
    2. Если добавитьСтолбцы = истина, тогда добавить в ТЗ два столбца:
        один для компонентов узла, а второй для учета количества вхождений компонента в узел.
    3. Положить, что добавитьСтолбцы = ложь.
    4. Начиная со второй записи выборки вставлять в таблицу значений ТЗ строки, заполняя ячейки в добавленных столбцах.
  7. Если в результате перебора массива М в ТЗ не было добавлено столбцов, то завершить формирование ТЗ и перейти к выводу данных, накопленных в ТЗ, в лист Excel.

Результирующая таблица значений показана на рис. 10.

Рисунок Результитрующей таблицы значений

Рис. 10. Результитрующая таблица значений в отчете Состав изделия

Данные выбираются из регистра сведений Комплектация узлов, переносятся в таблицу значений и выводятся в лист Excel следующим кодом:

процедура кнопкаСформироватьНажатие(Кнопка)
 очиститьСообщения();
 если узел.Пустая() тогда предупреждение ("Выберите узел"); возврат конецЕсли;
 // Проверяем, есть ли в справочнике Изделия гуппа Узлы
 узелГруппа = справочники.Изделия.НайтиПоНаименованию("Узлы");
 если узелГруппа.Пустая() тогда предупреждение ("Нет группы с наименованием Узлы"); возврат конецЕсли;
 // Проверяем, входит ли изделие в группу Узлы
 если узел.родитель <> узелГруппа тогда предупреждение ("Выбран плохой узел"); возврат конецЕсли;
 // Запрос к регистру сведений КомплектацияУзлов
 запрос = новый запрос;
 запрос.Текст = "выбрать узел, компонентУзла, количество
 | из регистрСведений.КомплектацияУзлов где узел = &узел";
 запрос.УстановитьПараметр("узел", узел);
 результатЗапроса = запрос.Выполнить();
 если результатЗапроса.Пустой() тогда предупреждение("Пусто"); возврат конецЕсли;
 // Начальная таблица значений
 тз = результатЗапроса.Выгрузить();
 // Формируем таблицу значений, содержащую сведения о составе выбранного узла
 // тп и тп2 - это типы данных добавляемых в таблицу столбцов
 тп = всПостроитьОписаниеТипа("справочникСсылка.Изделия");
 тп2 = всПостроитьОписаниеТипа("число", 5);
 м = тз.ВыгрузитьКолонку("компонентУзла");
 // Полагаем, что в результирующей таблице не более 100 столбцов
 для нс = 1 по 100 цикл
  добавитьСтолбцы = истина;
  вставитьСтроку = ложь;
  столбецИмя = "КомпонентУзла" + нс;
  столбецИмя2 = "Количество" + нс;
  текС = -1;
  кл = м.Количество() - 1;
  для к = 0 по кл цикл
   текС = текС + 1;
   текУзел = м[к];
   если текУзел.пустая() тогда продолжить конецЕсли;
   если текУзел.родитель <> узелГруппа тогда продолжить конецЕсли;
   запрос.УстановитьПараметр("узел", текУзел);
   результатЗапроса = запрос.Выполнить();
   если результатЗапроса.Пустой() тогда
    сообщить("Не укомплектован узел " + текУзел);
    продолжить;
   конецЕсли;
   в = результатЗапроса.Выбрать();
   пока в.Следующий() цикл
    если добавитьСтолбцы тогда
     тз.Колонки.Добавить(столбецИмя, тп);
     тз.Колонки.Добавить(столбецИмя2, тп2);
     добавитьСтолбцы = ложь;
     кс = тз.Колонки.Количество();
    конецЕсли;
    если вставитьСтроку тогда
     текС = текС + 1;
     тз.вставить(текС);
    конецЕсли;
    тз[текС][кс - 2] = в.компонентУзла;
    тз[текС][кс - 1] = в.количество;
    вставитьСтроку = истина;
   конецЦикла;
   вставитьСтроку = ложь;
  конецЦикла;
  если добавитьСтолбцы тогда
   прервать
  иначе
   м = тз.ВыгрузитьКолонку(столбецИмя);
  конецЕсли;
 конецЦикла;
 // Устраняем повторы в первом столбце таблицы
 для к = 1 по тз.Количество() - 1 цикл тз[к][0] = "" конецЦикла;
 попытка
  // Создаем Excel-документ
  Excel = Новый COMОбъект("Excel.Application");
  Книга = Excel.WorkBooks.Add();
  Лист = Книга.WorkSheets(1);
  // Заголовок
  Лист.PageSetup.Orientation = 2;   // Ориентация листа Альбомная
  ячейка = Лист.Cells(1, 1);
  ячейка.Font.Size = 14;  // Размер шрифта
  ячейка.Font.Bold = Истина; // Шрифт полужирный
  ячейка.Value = "Состав изделия (узла) " + тз[0][0];
  // Заголовки табличной части
  к = 0;
  р = 2;
  для каждого с из тз.Колонки цикл
   к = к + 1;
   если к = 1 или к % 2 = 0 тогда
    Лист.Columns(к).ColumnWidth = 16;  // Ширина столбцов Узел и Компонент узла
   иначе
    Лист.Columns(к).ColumnWidth = 11;  // Ширина столбца Количество
   конецЕсли;
   ячейка = Лист.Cells(р, к);
   ячейка.Borders.ColorIndex = 1;  // Черный цвет рамки
   ячейка.WrapText = Истина;   // Перенос текста
   ячейка.HorizontalAlignment = 3;  // Центрируем заголовки столбцов
   знчн = с.Имя;
   если лев(знчн, 3) = "Ком" тогда
    знчн = "Компонент узла"
   иначеЕсли лев(знчн, 3) = "Кол" тогда
    знчн = "Количество"
   конецЕсли;
   ячейка.Value = знчн;     // Заголовок столбца
  конецЦикла;
  нСтлбцв = тз.Колонки.Количество();   // Число стобцов в таблице значений
  нСтлбцв = нСтлбцв - 1;
  // Желтый цвет ячейки с названием изделия
  Лист.Cells(р + 1, 1).Interior.ColorIndex = 6; // или 36;
  // Содержимое табличной части
  для каждого с из тз цикл
   р = р + 1;
   Лист.Rows(р).WrapText = Истина;
   Лист.Rows(р).Font.Size = 11;
   грнц = 1;
   для к = 0 по нСтлбцв цикл
    знчн = с[к];
    ячейка = Лист.Cells(р, к + 1);
    ячейка.Borders(1).ColorIndex = 1; // Граница слева
    ячейка.Borders(2).ColorIndex = 1; // Граница справа
    если значениеЗаполнено(знчн) тогда
     ячейка.Borders(3).ColorIndex = 1; // Граница сверху
     если к % 2 = 1 и знчн.родитель = узелГруппа тогда
      // Зеленый цвет ячейки с названием узла
      ячейка.Interior.ColorIndex = 4; // или 35;
      грнц = 2; // Нет границы
     иначе
      если грнц = 2 тогда
       ячейка.Interior.ColorIndex = 4; // или 35;
      конецЕсли;
      если к > 0 тогда
       ячейка.Borders(4).ColorIndex = грнц; // Граница снизу
      конецЕсли;
      грнц = 1;
     конецЕсли;
     ячейка.Value = "" + знчн;
    конецЕсли;
   конецЦикла;
  конецЦикла;
  // Нижняя граница таблицы
  Лист.Rows(р).Borders(4).ColorIndex = 1;
  Excel.Visible = true;
 исключение
  сообщить(описаниеОшибки());
 конецПопытки;
конецПроцедуры

Заключение

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

Литература

  1. ГОСТ 2.102-2013. Единая система конструкторской документации. Виды и комплектность конструкторских документов.

Список работ

Рейтинг@Mail.ru