Разрабатывается на платформе 1С8:Предприятие приложение "Комплектация изделий", позволяющее фиксировать состав сборочной единицы (узла или конечного изделия). В общем случае узел может включать прочие узлы, детали, материалы и стандартные изделия, такие, как, гайки, шайбы и пр.
Для хранения сведений о компонентах узла создается справочник "Изделия" с группами "Детали" и "Узлы". Состав узла определяется в документе "Комплектация", движения которого фиксируются регистром сведений "КомплектацияУзлов".
По данным этого регистра формируется отчет "Состав изделия (узла)".
Формы элемента и списка справочника Изделия приведены на рис. 1 и 2.
Рис. 1. Форма элемента справочника Изделия
Рис. 2. Форма списка справочника Изделия
Справочник имеет следующие реквизиты:
В справочнике 2 уровня. На первом - имена групп изделий, на втором - сведения об изделиях. В группу Узлы заносятся данные о конечных изделиях и прочих узлах. В группе Детали хранятся сведения о деталях и стандарных изделиях.
Форма документа Комплектация и форма списка документа приведены на рис. 3 и 4.
Рис. 3. Форма документа Комплектация
Рис. 4. Форма списка документа Комплектация
Документ имеет табличную часть КомпонентыУзла и следующие реквизиты:
Табличная часть КомпонентыУзла имеет следующие реквизиты:
Движения документа фиксируются регистром сведений "КомплектацияУзлов" посредством следующей ОбработкиПроведения документа Комплектация:
Процедура ОбработкаПроведения(Отказ, Режим)
// Регистр КомплектацияУзлов
Движения.КомплектацияУзлов.Записывать = Истина;
Движения.КомплектацияУзлов.Очистить();
Для Каждого ТекСтрокаКомпонентыУзла Из КомпонентыУзла Цикл
Движение = Движения.КомплектацияУзлов.Добавить();
Движение.Узел = Узел;
Движение.КомпонентУзла = ТекСтрокаКомпонентыУзла.КомпонентУзла;
Движение.Вариант = Вариант;
Движение.Количество = ТекСтрокаКомпонентыУзла.Количество;
КонецЦикла;
КонецПроцедуры
Несколько записей регистра КомплектацияУзлов показаны на рис. 5.
Рис. 5. Список Комплектация узлов
В форме отчета (рис. 6) выбирается конечное изделие или узел (сборочная единица).
Рис. 6. Отчет Состав изделия
Результат выводится в лист Excel (рис. 7).
Рис. 7. Состав изделия Двигатель
Ячейка с наименованием узла, состав которого выводится, заливается желтым цветом. Ячейки с наименованиями подчиненных узлов заливаются зеленым цветом. Наименования деталей и стандартных изделий выводятся на белом фоне.
Для заливки используется свойство Interior.ColorIndex. По умолчанию ColorIndex берется из приведенной на рис. 8 цветовой палитры.
Рис. 8. Цветовая палитра для выбора ColorIndex
В отчете реализуется следующий алгоритм (проверки опускаются):
Рис. 9. Начальная таблица значений в отчете Состав изделия
Результирующая таблица значений показана на рис. 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;
исключение
сообщить(описаниеОшибки());
конецПопытки;
конецПроцедуры
В работе представлена упрощенная модель сборочной единицы, не позволяющая, в частности, различать виды комплектующих и формировать спецификацию изделия. Преодоление этих недостатков, а также расширение функционала приложения в интересах диспетчерской службы предприятия - это задачи последующих этапов учебного процесса.