mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-12 17:04:57 +03:00
51e37f9874
Реквизит шапки ПриходнаяНакладная.Менеджер типа CatalogRef.Контрагенты
с дефолтным choiceHistoryOnInput=Auto. Существующий Контрагент в той же
шапке имеет DontUse, что даёт парный контраст для тестирования влияния
флага на selectValue.
Новый шаг 04-selectvalue/auto-history:
- selectValue('Менеджер', 'ООО Юг') → method='dropdown' (typeahead активен,
префиксный поиск по Description находит «ООО Юг» в catalogue).
- Парный 04-selectvalue/direct-form (existing): selectValue('Контрагент',
'Север') → method='form' (typeahead подавлен DontUse → форма выбора).
Тест покрывает существующее ветвление selectValue по флагу
choiceHistoryOnInput без engine-доработок. Истории на сервере писать
заранее не нужно: typeahead использует prefix-match по Description,
а не статистику истории.
Полный регресс **18/18 зелёный** (8m 47.3s).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
888 lines
49 KiB
JavaScript
888 lines
49 KiB
JavaScript
// build-webtest-config.test.mjs — Integration test: build synthetic configuration for web-test regression
|
|
// Extends base-config with: diverse field types, hierarchical catalog, two-tab form,
|
|
// second subsystem, full-rights role.
|
|
// Steps: cf-init → meta-compile → form-add + form-compile → skd-compile
|
|
// → subsystem-compile → role-compile → cf-validate
|
|
|
|
export const name = 'Сборка конфигурации для web-test';
|
|
export const setup = 'none';
|
|
export const cache = 'webtest-config';
|
|
|
|
export const steps = [
|
|
// ── 1. Init empty configuration ──
|
|
{
|
|
name: 'cf-init: пустая конфигурация',
|
|
script: 'cf-init/scripts/cf-init',
|
|
args: { '-Name': 'ТестоваяВебКонфигурация', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'cf-validate/scripts/cf-validate', flag: '-ConfigPath' },
|
|
},
|
|
|
|
// ── 2. Metadata objects ──
|
|
|
|
// Справочник Контрагенты — простой, для CRUD и ссылочных полей
|
|
{
|
|
name: 'meta-compile: Справочник Контрагенты',
|
|
script: 'meta-compile/scripts/meta-compile',
|
|
input: {
|
|
type: 'Catalog', name: 'Контрагенты',
|
|
codeLength: 9, descriptionLength: 100,
|
|
attributes: [
|
|
{ name: 'ИНН', type: 'String', length: 12 },
|
|
{ name: 'Телефон', type: 'String', length: 20 },
|
|
{ name: 'Адрес', type: 'String', length: 200 },
|
|
{ name: 'КодКПП', type: 'String', length: 9 },
|
|
],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'Catalogs/Контрагенты' },
|
|
},
|
|
|
|
// Справочник Организации — маленький список с быстрым выбором (selectValue dropdown)
|
|
{
|
|
name: 'meta-compile: Справочник Организации',
|
|
script: 'meta-compile/scripts/meta-compile',
|
|
input: {
|
|
type: 'Catalog', name: 'Организации',
|
|
codeLength: 9, descriptionLength: 100,
|
|
quickChoice: true,
|
|
attributes: [
|
|
{ name: 'ИНН', type: 'String', length: 12 },
|
|
{ name: 'КПП', type: 'String', length: 9 },
|
|
],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'Catalogs/Организации' },
|
|
},
|
|
|
|
// Подчинённый каталог КонтактныеЛица — для теста getFormState.navigation (subordinate-nav)
|
|
{
|
|
name: 'meta-compile: Справочник КонтактныеЛица (подчинённый Контрагентам)',
|
|
script: 'meta-compile/scripts/meta-compile',
|
|
input: {
|
|
type: 'Catalog', name: 'КонтактныеЛица',
|
|
codeLength: 9, descriptionLength: 100,
|
|
owners: ['Catalog.Контрагенты'],
|
|
attributes: [
|
|
{ name: 'Должность', type: 'String', length: 100 },
|
|
{ name: 'Телефон', type: 'String', length: 20 },
|
|
],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'Catalogs/КонтактныеЛица' },
|
|
},
|
|
|
|
// Справочник Номенклатура — иерархический, все типы полей
|
|
{
|
|
name: 'meta-compile: Справочник Номенклатура',
|
|
script: 'meta-compile/scripts/meta-compile',
|
|
input: {
|
|
type: 'Catalog', name: 'Номенклатура',
|
|
codeLength: 11, descriptionLength: 150,
|
|
hierarchical: true,
|
|
attributes: [
|
|
{ name: 'Артикул', type: 'String', length: 25 },
|
|
{ name: 'Цена', type: 'Number', length: 15, precision: 2 },
|
|
{ name: 'Активен', type: 'Boolean' },
|
|
{ name: 'ДатаПоступления', type: 'Date' },
|
|
{ name: 'Комментарий', type: 'String' },
|
|
{ name: 'ЕдиницаИзмерения', type: 'String', length: 10 },
|
|
{ name: 'ВидНоменклатуры', type: 'EnumRef.ВидыНоменклатуры' },
|
|
{ name: 'КатегорияЦены', type: 'EnumRef.КатегорииЦен' },
|
|
{ name: 'СпособУчёта', type: 'EnumRef.СпособыУчёта' },
|
|
],
|
|
fillChecking: { 'Description': 'ShowError' },
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'Catalogs/Номенклатура' },
|
|
},
|
|
|
|
// Перечисление ВидыНоменклатуры
|
|
{
|
|
name: 'meta-compile: Перечисление ВидыНоменклатуры',
|
|
script: 'meta-compile/scripts/meta-compile',
|
|
input: {
|
|
type: 'Enum', name: 'ВидыНоменклатуры',
|
|
values: ['Товар', 'Услуга', 'Работа'],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'Enums/ВидыНоменклатуры' },
|
|
},
|
|
|
|
// Перечисление КатегорииЦен — для будущего radio-button теста (fillFields branch #3)
|
|
{
|
|
name: 'meta-compile: Перечисление КатегорииЦен',
|
|
script: 'meta-compile/scripts/meta-compile',
|
|
input: {
|
|
type: 'Enum', name: 'КатегорииЦен',
|
|
values: ['Розничная', 'Оптовая', 'Закупочная'],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'Enums/КатегорииЦен' },
|
|
},
|
|
|
|
// Перечисление СпособыУчёта — для radio с видом Tumbler (fillFields branch #3)
|
|
{
|
|
name: 'meta-compile: Перечисление СпособыУчёта',
|
|
script: 'meta-compile/scripts/meta-compile',
|
|
input: {
|
|
type: 'Enum', name: 'СпособыУчёта',
|
|
values: ['ПоСреднему', 'ФИФО'],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'Enums/СпособыУчёта' },
|
|
},
|
|
|
|
// Документ ПриходнаяНакладная — шапка + ТЧ
|
|
{
|
|
name: 'meta-compile: Документ ПриходнаяНакладная',
|
|
script: 'meta-compile/scripts/meta-compile',
|
|
input: {
|
|
type: 'Document', name: 'ПриходнаяНакладная',
|
|
attributes: [
|
|
{ name: 'Организация', type: 'CatalogRef.Организации' },
|
|
// choiceHistoryOnInput=DontUse: предотвращает выбор через историю в smoke-тестах
|
|
// (04-selectvalue/direct-form проверяет open-form path; история обходит его).
|
|
{ name: 'Контрагент', type: 'CatalogRef.Контрагенты', choiceHistoryOnInput: 'DontUse' },
|
|
{ name: 'Склад', type: 'String', length: 50 },
|
|
// Источник — составной тип (для 03-fillfields/composite).
|
|
// Платформа покажет селектор типа в UI перед выбором значения.
|
|
{ name: 'Источник', type: 'CatalogRef.Контрагенты + CatalogRef.Номенклатура + CatalogRef.Организации' },
|
|
// Поставщик — обычная ссылка, но на форме элемент с textEdit:false
|
|
// (для 03-fillfields/direct-edit-form). Ручной ввод запрещён,
|
|
// выбор только через pick-кнопку → форма выбора.
|
|
{ name: 'Поставщик', type: 'CatalogRef.Контрагенты' },
|
|
// Менеджер — ссылка с дефолтным choiceHistoryOnInput=Auto (история включена,
|
|
// для 04-selectvalue/show-all-form). После первого выбора платформа
|
|
// запоминает значение и при повторном вводе показывает dropdown
|
|
// с историей + кнопку «Показать все» → форма выбора.
|
|
{ name: 'Менеджер', type: 'CatalogRef.Контрагенты' },
|
|
{ name: 'Комментарий', type: 'String', length: 200 },
|
|
],
|
|
tabularSections: [{
|
|
name: 'Товары',
|
|
attributes: [
|
|
{ name: 'Номенклатура', type: 'CatalogRef.Номенклатура' },
|
|
{ name: 'Количество', type: 'Number', length: 15, precision: 3 },
|
|
{ name: 'Цена', type: 'Number', length: 15, precision: 2 },
|
|
{ name: 'Сумма', type: 'Number', length: 15, precision: 2 },
|
|
{ name: 'Согласовано', type: 'Boolean' },
|
|
// Источник — составной тип в ТЧ (для edit-dblclick через выбор типа)
|
|
{ name: 'Источник', type: 'CatalogRef.Контрагенты + CatalogRef.Номенклатура + CatalogRef.Организации' },
|
|
],
|
|
}],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'Documents/ПриходнаяНакладная' },
|
|
},
|
|
|
|
// Регистр сведений КурсыВалют (Independent — без регистратора)
|
|
{
|
|
name: 'meta-compile: Регистр сведений КурсыВалют',
|
|
script: 'meta-compile/scripts/meta-compile',
|
|
input: {
|
|
type: 'InformationRegister', name: 'КурсыВалют',
|
|
writeMode: 'Independent',
|
|
dimensions: [
|
|
{ name: 'Валюта', type: 'String', length: 10 },
|
|
],
|
|
resources: [
|
|
{ name: 'Курс', type: 'Number', length: 10, precision: 4 },
|
|
{ name: 'Кратность', type: 'Number', length: 10 },
|
|
],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'InformationRegisters/КурсыВалют' },
|
|
},
|
|
|
|
// Константа ОсновнаяВалюта
|
|
{
|
|
name: 'meta-compile: Константа ОсновнаяВалюта',
|
|
script: 'meta-compile/scripts/meta-compile',
|
|
input: {
|
|
type: 'Constant', name: 'ОсновнаяВалюта',
|
|
valueType: 'String', length: 10,
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'Constants/ОсновнаяВалюта' },
|
|
},
|
|
|
|
// Константа ДанныеЗаполнены — флаг первоначального заполнения фикстур
|
|
{
|
|
name: 'meta-compile: Константа ДанныеЗаполнены',
|
|
script: 'meta-compile/scripts/meta-compile',
|
|
input: {
|
|
type: 'Constant', name: 'ДанныеЗаполнены',
|
|
valueType: 'Boolean',
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'Constants/ДанныеЗаполнены' },
|
|
},
|
|
|
|
// Общий модуль ОбщиеФункции
|
|
{
|
|
name: 'meta-compile: Общий модуль ОбщиеФункции',
|
|
script: 'meta-compile/scripts/meta-compile',
|
|
input: {
|
|
type: 'CommonModule', name: 'ОбщиеФункции',
|
|
server: true, serverCall: true, clientManagedApplication: false,
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'CommonModules/ОбщиеФункции' },
|
|
},
|
|
{
|
|
name: 'writeFile: ОбщиеФункции Module.bsl',
|
|
writeFile: 'CommonModules/ОбщиеФункции/Ext/Module.bsl',
|
|
content: `Процедура ПоказатьСообщение() Экспорт
|
|
\tСообщить("Тестовое сообщение");
|
|
КонецПроцедуры
|
|
|
|
Процедура ВызватьТестовоеИсключение() Экспорт
|
|
\tВызватьИсключение "Тестовое исключение";
|
|
КонецПроцедуры
|
|
|
|
Процедура ЗаполнитьФикстурыЕслиНужно() Экспорт
|
|
\tЕсли Константы.ДанныеЗаполнены.Получить() Тогда
|
|
\t\tВозврат;
|
|
\tКонецЕсли;
|
|
\tНачатьТранзакцию();
|
|
\tПопытка
|
|
\t\tЗаполнитьОрганизации();
|
|
\t\tЗаполнитьКонтрагентов();
|
|
\t\tЗаполнитьНоменклатуру();
|
|
\t\tЗаполнитьДокументы();
|
|
\t\tКонстанты.ДанныеЗаполнены.Установить(Истина);
|
|
\t\tЗафиксироватьТранзакцию();
|
|
\tИсключение
|
|
\t\tОтменитьТранзакцию();
|
|
\t\tВызватьИсключение;
|
|
\tКонецПопытки;
|
|
КонецПроцедуры
|
|
|
|
Процедура ЗаполнитьОрганизации()
|
|
\tСписок = Новый Массив;
|
|
\tСписок.Добавить(Новый Структура("Имя,ИНН,КПП", "Альфа", "7800000001", "780000001"));
|
|
\tСписок.Добавить(Новый Структура("Имя,ИНН,КПП", "Бета", "7800000002", "780000002"));
|
|
\tДля Каждого Запись Из Список Цикл
|
|
\t\tЭлемент = Справочники.Организации.СоздатьЭлемент();
|
|
\t\tЭлемент.Наименование = Запись.Имя;
|
|
\t\tЭлемент.ИНН = Запись.ИНН;
|
|
\t\tЭлемент.КПП = Запись.КПП;
|
|
\t\tЭлемент.Записать();
|
|
\tКонецЦикла;
|
|
КонецПроцедуры
|
|
|
|
Процедура ЗаполнитьКонтрагентов()
|
|
\tСписок = Новый Массив;
|
|
\tСписок.Добавить(Новый Структура("Имя,ИНН", "ООО Север", "7700000001"));
|
|
\tСписок.Добавить(Новый Структура("Имя,ИНН", "ООО Юг", "7700000002"));
|
|
\tСписок.Добавить(Новый Структура("Имя,ИНН", "ООО Восток", "7700000003"));
|
|
\tСписок.Добавить(Новый Структура("Имя,ИНН", "АО Запад", "7700000004"));
|
|
\tДля Каждого Запись Из Список Цикл
|
|
\t\tЭлемент = Справочники.Контрагенты.СоздатьЭлемент();
|
|
\t\tЭлемент.Наименование = Запись.Имя;
|
|
\t\tЭлемент.ИНН = Запись.ИНН;
|
|
\t\tЭлемент.Записать();
|
|
\tКонецЦикла;
|
|
КонецПроцедуры
|
|
|
|
Процедура ЗаполнитьНоменклатуру()
|
|
\tГруппаТовары = СоздатьГруппуНоменклатуры("Товары");
|
|
\tГруппаУслуги = СоздатьГруппуНоменклатуры("Услуги");
|
|
\tДля Сч = 1 По 15 Цикл
|
|
\t\tЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
|
|
\t\tЭлемент.Родитель = ГруппаТовары;
|
|
\t\tЭлемент.Наименование = "Товар " + Формат(Сч, "ЧЦ=2; ЧВН=");
|
|
\t\tЭлемент.Артикул = "T" + Формат(Сч, "ЧЦ=4; ЧВН=");
|
|
\t\tЭлемент.Цена = 100 * Сч;
|
|
\t\tЭлемент.Активен = Истина;
|
|
\t\tЭлемент.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар;
|
|
\t\tЭлемент.Записать();
|
|
\tКонецЦикла;
|
|
\tДля Сч = 1 По 10 Цикл
|
|
\t\tЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
|
|
\t\tЭлемент.Родитель = ГруппаУслуги;
|
|
\t\tЭлемент.Наименование = "Услуга " + Формат(Сч, "ЧЦ=2; ЧВН=");
|
|
\t\tЭлемент.Артикул = "U" + Формат(Сч, "ЧЦ=4; ЧВН=");
|
|
\t\tЭлемент.Цена = 500 * Сч;
|
|
\t\tЭлемент.Активен = Истина;
|
|
\t\tЭлемент.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга;
|
|
\t\tЭлемент.Записать();
|
|
\tКонецЦикла;
|
|
КонецПроцедуры
|
|
|
|
Функция СоздатьГруппуНоменклатуры(Имя)
|
|
\tГруппа = Справочники.Номенклатура.СоздатьГруппу();
|
|
\tГруппа.Наименование = Имя;
|
|
\tГруппа.Записать();
|
|
\tВозврат Группа.Ссылка;
|
|
КонецФункции
|
|
|
|
Процедура ЗаполнитьДокументы()
|
|
\tЗапросК = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 5 Контрагенты.Ссылка КАК Контрагент ИЗ Справочник.Контрагенты КАК Контрагенты");
|
|
\tКонтрагенты = ЗапросК.Выполнить().Выгрузить().ВыгрузитьКолонку("Контрагент");
|
|
\tЗапросН = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 10 Номенклатура.Ссылка КАК Номенклатура ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ НЕ Номенклатура.ЭтоГруппа");
|
|
\tНоменклатура = ЗапросН.Выполнить().Выгрузить().ВыгрузитьКолонку("Номенклатура");
|
|
\tЕсли Контрагенты.Количество() = 0 Или Номенклатура.Количество() = 0 Тогда
|
|
\t\tВозврат;
|
|
\tКонецЕсли;
|
|
\tЗапросО = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 Организации.Ссылка КАК Организация ИЗ Справочник.Организации КАК Организации");
|
|
\tВыборкаО = ЗапросО.Выполнить().Выбрать();
|
|
\tОрганизация = Неопределено;
|
|
\tЕсли ВыборкаО.Следующий() Тогда
|
|
\t\tОрганизация = ВыборкаО.Организация;
|
|
\tКонецЕсли;
|
|
\tДля Сч = 1 По 3 Цикл
|
|
\t\tДок = Документы.ПриходнаяНакладная.СоздатьДокумент();
|
|
\t\tДок.Дата = ТекущаяДата();
|
|
\t\tДок.Организация = Организация;
|
|
\t\tДок.Контрагент = Контрагенты[(Сч - 1) % Контрагенты.Количество()];
|
|
\t\tДок.Склад = "Основной";
|
|
\t\tДля Поз = 1 По 3 Цикл
|
|
\t\t\tСтрока = Док.Товары.Добавить();
|
|
\t\t\tСтрока.Номенклатура = Номенклатура[(Сч * Поз) % Номенклатура.Количество()];
|
|
\t\t\tСтрока.Количество = Поз * 10;
|
|
\t\t\tСтрока.Цена = Поз * 100;
|
|
\t\t\tСтрока.Сумма = Строка.Количество * Строка.Цена;
|
|
\t\tКонецЦикла;
|
|
\t\tДок.Записать(РежимЗаписиДокумента.Запись);
|
|
\tКонецЦикла;
|
|
КонецПроцедуры
|
|
`,
|
|
},
|
|
|
|
// ManagedApplicationModule — вызывает заполнение фикстур при первом запуске
|
|
{
|
|
name: 'writeFile: ManagedApplicationModule.bsl',
|
|
writeFile: 'Ext/ManagedApplicationModule.bsl',
|
|
content: `&НаКлиенте
|
|
Процедура ПриНачалеРаботыСистемы()
|
|
\tОбщиеФункции.ЗаполнитьФикстурыЕслиНужно();
|
|
КонецПроцедуры
|
|
`,
|
|
},
|
|
|
|
// Раскладка панелей (Ext/ClientApplicationInterface.xml) теперь создаётся
|
|
// самим cf-init с ERP-дефолтом — отдельная запись больше не нужна.
|
|
|
|
// Обработка ТестовыеОшибки — для тестов errors balloon/messages/modal (10-validation)
|
|
{
|
|
name: 'meta-compile: Обработка ТестовыеОшибки',
|
|
script: 'meta-compile/scripts/meta-compile',
|
|
input: {
|
|
type: 'DataProcessor', name: 'ТестовыеОшибки',
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'DataProcessors/ТестовыеОшибки' },
|
|
},
|
|
|
|
// Обработка ДеревоНоменклатуры — реквизит формы ДеревоЗначений с данными
|
|
// справочника Номенклатура для тестов tree-grid (05-table/direct-edit-form,
|
|
// 08-hierarchy/tree-edit).
|
|
{
|
|
name: 'meta-compile: Обработка ДеревоНоменклатуры',
|
|
script: 'meta-compile/scripts/meta-compile',
|
|
input: {
|
|
type: 'DataProcessor', name: 'ДеревоНоменклатуры',
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'DataProcessors/ДеревоНоменклатуры' },
|
|
},
|
|
|
|
// Отчёт ОстаткиТоваров
|
|
{
|
|
name: 'meta-compile: Отчёт ОстаткиТоваров',
|
|
script: 'meta-compile/scripts/meta-compile',
|
|
input: {
|
|
type: 'Report', name: 'ОстаткиТоваров',
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'Reports/ОстаткиТоваров' },
|
|
},
|
|
|
|
// ── 3. Forms ──
|
|
|
|
// Форма элемента Контрагенты — простая
|
|
{
|
|
name: 'form-add: Форма элемента Контрагенты',
|
|
script: 'form-add/scripts/form-add',
|
|
args: { '-ObjectPath': '{workDir}/Catalogs/Контрагенты.xml', '-FormName': 'ФормаЭлемента' },
|
|
},
|
|
{
|
|
name: 'form-compile: Форма элемента Контрагенты',
|
|
script: 'form-compile/scripts/form-compile',
|
|
input: {
|
|
title: 'Контрагент',
|
|
attributes: [
|
|
{ name: 'Объект', type: 'CatalogObject.Контрагенты', main: true },
|
|
],
|
|
elements: [
|
|
{ input: 'Наименование', path: 'Объект.Description', title: 'Наименование' },
|
|
{ input: 'ИНН', path: 'Объект.ИНН', title: 'ИНН' },
|
|
{ input: 'Телефон', path: 'Объект.Телефон', title: 'Телефон' },
|
|
{ input: 'Адрес', path: 'Объект.Адрес', title: 'Адрес' },
|
|
],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputPath': '{workDir}/Catalogs/Контрагенты/Forms/ФормаЭлемента/Ext/Form.xml' },
|
|
validate: { script: 'form-validate/scripts/form-validate', flag: '-FormPath', path: 'Catalogs/Контрагенты/Forms/ФормаЭлемента/Ext/Form.xml' },
|
|
},
|
|
|
|
// Форма элемента КонтактныеЛица + список — для подчинённого каталога
|
|
{
|
|
name: 'form-add: Форма элемента КонтактныеЛица',
|
|
script: 'form-add/scripts/form-add',
|
|
args: { '-ObjectPath': '{workDir}/Catalogs/КонтактныеЛица.xml', '-FormName': 'ФормаЭлемента' },
|
|
},
|
|
{
|
|
name: 'form-compile: Форма элемента КонтактныеЛица',
|
|
script: 'form-compile/scripts/form-compile',
|
|
input: {
|
|
title: 'Контактное лицо',
|
|
attributes: [
|
|
{ name: 'Объект', type: 'CatalogObject.КонтактныеЛица', main: true },
|
|
],
|
|
elements: [
|
|
{ input: 'Владелец', path: 'Объект.Owner', title: 'Контрагент' },
|
|
{ input: 'Наименование', path: 'Объект.Description', title: 'ФИО' },
|
|
{ input: 'Должность', path: 'Объект.Должность', title: 'Должность' },
|
|
{ input: 'Телефон', path: 'Объект.Телефон', title: 'Телефон' },
|
|
],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputPath': '{workDir}/Catalogs/КонтактныеЛица/Forms/ФормаЭлемента/Ext/Form.xml' },
|
|
validate: { script: 'form-validate/scripts/form-validate', flag: '-FormPath', path: 'Catalogs/КонтактныеЛица/Forms/ФормаЭлемента/Ext/Form.xml' },
|
|
},
|
|
{
|
|
name: 'form-add: Форма списка КонтактныеЛица',
|
|
script: 'form-add/scripts/form-add',
|
|
args: { '-ObjectPath': '{workDir}/Catalogs/КонтактныеЛица.xml', '-FormName': 'ФормаСписка', '-Purpose': 'List' },
|
|
},
|
|
{
|
|
name: 'form-compile: Форма списка КонтактныеЛица',
|
|
script: 'form-compile/scripts/form-compile',
|
|
input: {
|
|
title: 'Контактные лица',
|
|
attributes: [
|
|
{ name: 'Список', type: 'DynamicList', main: true,
|
|
settings: { mainTable: 'Catalog.КонтактныеЛица', dynamicDataRead: true } },
|
|
],
|
|
elements: [
|
|
{ table: 'Список', path: 'Список', columns: [
|
|
{ input: 'Description', path: 'Список.Description', title: 'ФИО' },
|
|
{ input: 'Должность', path: 'Список.Должность', title: 'Должность' },
|
|
{ input: 'Телефон', path: 'Список.Телефон', title: 'Телефон' },
|
|
]},
|
|
],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputPath': '{workDir}/Catalogs/КонтактныеЛица/Forms/ФормаСписка/Ext/Form.xml' },
|
|
validate: { script: 'form-validate/scripts/form-validate', flag: '-FormPath', path: 'Catalogs/КонтактныеЛица/Forms/ФормаСписка/Ext/Form.xml' },
|
|
},
|
|
|
|
// Форма списка Контрагенты — для filterList тестов. КодКПП НЕ выводим
|
|
// в форму — это покрывает FieldSelector DLB ветку (filterList #5)
|
|
{
|
|
name: 'form-add: Форма списка Контрагенты',
|
|
script: 'form-add/scripts/form-add',
|
|
args: { '-ObjectPath': '{workDir}/Catalogs/Контрагенты.xml', '-FormName': 'ФормаСписка', '-Purpose': 'List' },
|
|
},
|
|
{
|
|
name: 'form-compile: Форма списка Контрагенты',
|
|
script: 'form-compile/scripts/form-compile',
|
|
input: {
|
|
title: 'Контрагенты',
|
|
attributes: [
|
|
{ name: 'Список', type: 'DynamicList', main: true,
|
|
settings: { mainTable: 'Catalog.Контрагенты', dynamicDataRead: true } },
|
|
],
|
|
elements: [
|
|
{ table: 'Список', path: 'Список', columns: [
|
|
{ input: 'Code', path: 'Список.Code', title: 'Код' },
|
|
{ input: 'Description', path: 'Список.Description', title: 'Наименование' },
|
|
{ input: 'ИНН', path: 'Список.ИНН', title: 'ИНН' },
|
|
{ input: 'Телефон', path: 'Список.Телефон', title: 'Телефон' },
|
|
{ input: 'Адрес', path: 'Список.Адрес', title: 'Адрес' },
|
|
]},
|
|
],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputPath': '{workDir}/Catalogs/Контрагенты/Forms/ФормаСписка/Ext/Form.xml' },
|
|
validate: { script: 'form-validate/scripts/form-validate', flag: '-FormPath', path: 'Catalogs/Контрагенты/Forms/ФормаСписка/Ext/Form.xml' },
|
|
},
|
|
|
|
// Форма элемента Номенклатура — 2 вкладки, все типы полей
|
|
{
|
|
name: 'form-add: Форма элемента Номенклатура',
|
|
script: 'form-add/scripts/form-add',
|
|
args: { '-ObjectPath': '{workDir}/Catalogs/Номенклатура.xml', '-FormName': 'ФормаЭлемента' },
|
|
},
|
|
{
|
|
name: 'form-compile: Форма элемента Номенклатура (2 вкладки)',
|
|
script: 'form-compile/scripts/form-compile',
|
|
input: {
|
|
title: 'Номенклатура',
|
|
attributes: [
|
|
{ name: 'Объект', type: 'CatalogObject.Номенклатура', main: true },
|
|
],
|
|
elements: [
|
|
{ pages: 'Страницы', pagesRepresentation: 'TabsOnTop', children: [
|
|
{ page: 'Основное', title: 'Основное', children: [
|
|
{ input: 'Наименование', path: 'Объект.Description', title: 'Наименование' },
|
|
{ input: 'Артикул', path: 'Объект.Артикул', title: 'Артикул' },
|
|
{ input: 'ВидНоменклатуры', path: 'Объект.ВидНоменклатуры', title: 'Вид номенклатуры' },
|
|
{ input: 'Цена', path: 'Объект.Цена', title: 'Цена' },
|
|
{ radio: 'КатегорияЦены', path: 'Объект.КатегорияЦены',
|
|
title: 'Категория цены',
|
|
radioButtonType: 'RadioButtons',
|
|
titleLocation: 'Top',
|
|
choiceList: [
|
|
{ value: 'Enum.КатегорииЦен.EnumValue.Розничная', presentation: 'Розничная' },
|
|
{ value: 'Enum.КатегорииЦен.EnumValue.Оптовая', presentation: 'Оптовая' },
|
|
{ value: 'Enum.КатегорииЦен.EnumValue.Закупочная', presentation: 'Закупочная' },
|
|
],
|
|
},
|
|
{ radio: 'СпособУчёта', path: 'Объект.СпособУчёта',
|
|
title: 'Способ учёта',
|
|
radioButtonType: 'Tumbler',
|
|
titleLocation: 'Top',
|
|
choiceList: [
|
|
{ value: 'Enum.СпособыУчёта.EnumValue.ПоСреднему', presentation: 'По среднему' },
|
|
{ value: 'Enum.СпособыУчёта.EnumValue.ФИФО', presentation: 'ФИФО' },
|
|
],
|
|
},
|
|
{ check: 'Активен', path: 'Объект.Активен', title: 'Активен' },
|
|
{ input: 'ДатаПоступления', path: 'Объект.ДатаПоступления', title: 'Дата поступления' },
|
|
]},
|
|
{ page: 'Дополнительно', title: 'Дополнительно', children: [
|
|
{ input: 'ЕдиницаИзмерения', path: 'Объект.ЕдиницаИзмерения', title: 'Единица измерения' },
|
|
{ input: 'Комментарий', path: 'Объект.Комментарий', title: 'Комментарий' },
|
|
]},
|
|
]},
|
|
],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputPath': '{workDir}/Catalogs/Номенклатура/Forms/ФормаЭлемента/Ext/Form.xml' },
|
|
validate: { script: 'form-validate/scripts/form-validate', flag: '-FormPath', path: 'Catalogs/Номенклатура/Forms/ФормаЭлемента/Ext/Form.xml' },
|
|
},
|
|
|
|
// Форма списка Номенклатура — с колонкой ДатаПоступления для filterList #6 (date pattern)
|
|
{
|
|
name: 'form-add: Форма списка Номенклатура',
|
|
script: 'form-add/scripts/form-add',
|
|
args: { '-ObjectPath': '{workDir}/Catalogs/Номенклатура.xml', '-FormName': 'ФормаСписка', '-Purpose': 'List' },
|
|
},
|
|
{
|
|
name: 'form-compile: Форма списка Номенклатура',
|
|
script: 'form-compile/scripts/form-compile',
|
|
input: {
|
|
title: 'Номенклатура',
|
|
attributes: [
|
|
{ name: 'Список', type: 'DynamicList', main: true,
|
|
settings: { mainTable: 'Catalog.Номенклатура', dynamicDataRead: true } },
|
|
],
|
|
elements: [
|
|
{ table: 'Список', path: 'Список', columns: [
|
|
{ input: 'Code', path: 'Список.Code', title: 'Код' },
|
|
{ input: 'Description', path: 'Список.Description', title: 'Наименование' },
|
|
{ input: 'Артикул', path: 'Список.Артикул', title: 'Артикул' },
|
|
{ input: 'ВидНоменклатуры', path: 'Список.ВидНоменклатуры', title: 'Вид номенклатуры' },
|
|
{ input: 'ДатаПоступления', path: 'Список.ДатаПоступления', title: 'Дата поступления' },
|
|
{ input: 'Цена', path: 'Список.Цена', title: 'Цена' },
|
|
{ check: 'Активен', path: 'Список.Активен', title: 'Активен' },
|
|
]},
|
|
],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputPath': '{workDir}/Catalogs/Номенклатура/Forms/ФормаСписка/Ext/Form.xml' },
|
|
validate: { script: 'form-validate/scripts/form-validate', flag: '-FormPath', path: 'Catalogs/Номенклатура/Forms/ФормаСписка/Ext/Form.xml' },
|
|
},
|
|
|
|
// Форма документа ПриходнаяНакладная
|
|
{
|
|
name: 'form-add: Форма документа ПриходнаяНакладная',
|
|
script: 'form-add/scripts/form-add',
|
|
args: { '-ObjectPath': '{workDir}/Documents/ПриходнаяНакладная.xml', '-FormName': 'ФормаДокумента' },
|
|
},
|
|
{
|
|
name: 'form-compile: Форма документа ПриходнаяНакладная',
|
|
script: 'form-compile/scripts/form-compile',
|
|
input: {
|
|
title: 'Приходная накладная',
|
|
attributes: [
|
|
{ name: 'Объект', type: 'DocumentObject.ПриходнаяНакладная', main: true },
|
|
],
|
|
elements: [
|
|
{ input: 'Организация', path: 'Объект.Организация', title: 'Организация' },
|
|
{ input: 'Контрагент', path: 'Объект.Контрагент', title: 'Контрагент' },
|
|
{ input: 'Склад', path: 'Объект.Склад', title: 'Склад' },
|
|
{ input: 'Источник', path: 'Объект.Источник', title: 'Источник' },
|
|
// textEdit:false — ручной ввод запрещён, только pick → форма выбора
|
|
{ input: 'Поставщик', path: 'Объект.Поставщик', title: 'Поставщик', textEdit: false },
|
|
{ input: 'Менеджер', path: 'Объект.Менеджер', title: 'Менеджер' },
|
|
{ input: 'Комментарий', path: 'Объект.Комментарий', title: 'Комментарий' },
|
|
{ table: 'Товары', path: 'Объект.Товары', title: 'Товары', changeRowSet: true, columns: [
|
|
{ input: 'Номенклатура', path: 'Объект.Товары.Номенклатура', title: 'Номенклатура' },
|
|
{ input: 'Количество', path: 'Объект.Товары.Количество', title: 'Количество' },
|
|
{ input: 'Цена', path: 'Объект.Товары.Цена', title: 'Цена' },
|
|
{ input: 'Сумма', path: 'Объект.Товары.Сумма', title: 'Сумма' },
|
|
{ check: 'Согласовано', path: 'Объект.Товары.Согласовано', title: 'Согласовано' },
|
|
// Имя элемента отличается от Источник (в шапке) — иначе ContextMenu
|
|
// companion-имена дублируются в одной форме. form-compile использует
|
|
// имя элемента, не путь, для генерации companion-имён.
|
|
{ input: 'ИсточникТЧ', path: 'Объект.Товары.Источник', title: 'Источник' },
|
|
]},
|
|
],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputPath': '{workDir}/Documents/ПриходнаяНакладная/Forms/ФормаДокумента/Ext/Form.xml' },
|
|
validate: { script: 'form-validate/scripts/form-validate', flag: '-FormPath', path: 'Documents/ПриходнаяНакладная/Forms/ФормаДокумента/Ext/Form.xml' },
|
|
},
|
|
|
|
// Форма списка ПриходнаяНакладная — с колонкой Контрагент для filterList #7 (reference pattern)
|
|
{
|
|
name: 'form-add: Форма списка ПриходнаяНакладная',
|
|
script: 'form-add/scripts/form-add',
|
|
args: { '-ObjectPath': '{workDir}/Documents/ПриходнаяНакладная.xml', '-FormName': 'ФормаСписка', '-Purpose': 'List' },
|
|
},
|
|
{
|
|
name: 'form-compile: Форма списка ПриходнаяНакладная',
|
|
script: 'form-compile/scripts/form-compile',
|
|
input: {
|
|
title: 'Приходные накладные',
|
|
attributes: [
|
|
{ name: 'Список', type: 'DynamicList', main: true,
|
|
settings: { mainTable: 'Document.ПриходнаяНакладная', dynamicDataRead: true } },
|
|
],
|
|
elements: [
|
|
{ table: 'Список', path: 'Список', columns: [
|
|
{ input: 'Date', path: 'Список.Date', title: 'Дата' },
|
|
{ input: 'Number', path: 'Список.Number', title: 'Номер' },
|
|
{ input: 'Контрагент', path: 'Список.Контрагент', title: 'Контрагент' },
|
|
{ input: 'Posted', path: 'Список.Posted', title: 'Проведён' },
|
|
]},
|
|
],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputPath': '{workDir}/Documents/ПриходнаяНакладная/Forms/ФормаСписка/Ext/Form.xml' },
|
|
validate: { script: 'form-validate/scripts/form-validate', flag: '-FormPath', path: 'Documents/ПриходнаяНакладная/Forms/ФормаСписка/Ext/Form.xml' },
|
|
},
|
|
|
|
// Форма обработки ТестовыеОшибки — кнопки вызова процедур ОбщиеФункции
|
|
{
|
|
name: 'form-add: Форма обработки ТестовыеОшибки',
|
|
script: 'form-add/scripts/form-add',
|
|
args: { '-ObjectPath': '{workDir}/DataProcessors/ТестовыеОшибки.xml', '-FormName': 'ФормаОбработки' },
|
|
},
|
|
{
|
|
name: 'form-compile: Форма обработки ТестовыеОшибки',
|
|
script: 'form-compile/scripts/form-compile',
|
|
input: {
|
|
title: 'Тестовые ошибки',
|
|
attributes: [
|
|
{ name: 'Объект', type: 'DataProcessorObject.ТестовыеОшибки', main: true },
|
|
],
|
|
elements: [
|
|
{ button: 'ПоказатьСообщение', command: 'ПоказатьСообщение', title: 'Показать сообщение' },
|
|
{ button: 'ВызватьИсключение', command: 'ВызватьИсключениеКоманда', title: 'Вызвать исключение' },
|
|
],
|
|
commands: [
|
|
{ name: 'ПоказатьСообщение', action: 'ПоказатьСообщение' },
|
|
{ name: 'ВызватьИсключениеКоманда', action: 'ВызватьИсключениеКоманда' },
|
|
],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputPath': '{workDir}/DataProcessors/ТестовыеОшибки/Forms/ФормаОбработки/Ext/Form.xml' },
|
|
validate: { script: 'form-validate/scripts/form-validate', flag: '-FormPath', path: 'DataProcessors/ТестовыеОшибки/Forms/ФормаОбработки/Ext/Form.xml' },
|
|
},
|
|
{
|
|
name: 'writeFile: ТестовыеОшибки form Module.bsl',
|
|
writeFile: 'DataProcessors/ТестовыеОшибки/Forms/ФормаОбработки/Ext/Form/Module.bsl',
|
|
content: `&НаКлиенте
|
|
Процедура ПоказатьСообщение(Команда)
|
|
\tПоказатьСообщениеНаСервере();
|
|
КонецПроцедуры
|
|
|
|
&НаСервере
|
|
Процедура ПоказатьСообщениеНаСервере()
|
|
\tОбщиеФункции.ПоказатьСообщение();
|
|
КонецПроцедуры
|
|
|
|
&НаКлиенте
|
|
Процедура ВызватьИсключениеКоманда(Команда)
|
|
\tВызватьИсключениеНаСервере();
|
|
КонецПроцедуры
|
|
|
|
&НаСервере
|
|
Процедура ВызватьИсключениеНаСервере()
|
|
\tОбщиеФункции.ВызватьТестовоеИсключение();
|
|
КонецПроцедуры
|
|
`,
|
|
},
|
|
|
|
// Форма обработки ДеревоНоменклатуры — tree-grid с двумя колонками
|
|
{
|
|
name: 'form-add: Форма обработки ДеревоНоменклатуры',
|
|
script: 'form-add/scripts/form-add',
|
|
args: { '-ObjectPath': '{workDir}/DataProcessors/ДеревоНоменклатуры.xml', '-FormName': 'ФормаОбработки' },
|
|
},
|
|
{
|
|
name: 'form-compile: Форма обработки ДеревоНоменклатуры',
|
|
script: 'form-compile/scripts/form-compile',
|
|
input: {
|
|
title: 'Дерево номенклатуры',
|
|
events: { OnCreateAtServer: 'ПриСозданииНаСервере' },
|
|
attributes: [
|
|
{ name: 'Объект', type: 'DataProcessorObject.ДеревоНоменклатуры', main: true },
|
|
{ name: 'Дерево', type: 'ValueTree', columns: [
|
|
{ name: 'Номенклатура', type: 'CatalogRef.Номенклатура', title: 'Номенклатура' },
|
|
{ name: 'Цена', type: 'Number(15,2)', title: 'Цена' },
|
|
]},
|
|
],
|
|
elements: [
|
|
{ table: 'Дерево', path: 'Дерево', initialTreeView: 'ExpandTopLevel', changeRowSet: true, columns: [
|
|
{ input: 'Номенклатура', path: 'Дерево.Номенклатура', readOnly: true, title: 'Номенклатура' },
|
|
{ input: 'Цена', path: 'Дерево.Цена', title: 'Цена' },
|
|
]},
|
|
],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputPath': '{workDir}/DataProcessors/ДеревоНоменклатуры/Forms/ФормаОбработки/Ext/Form.xml' },
|
|
validate: { script: 'form-validate/scripts/form-validate', flag: '-FormPath', path: 'DataProcessors/ДеревоНоменклатуры/Forms/ФормаОбработки/Ext/Form.xml' },
|
|
},
|
|
{
|
|
name: 'writeFile: ДеревоНоменклатуры form Module.bsl',
|
|
writeFile: 'DataProcessors/ДеревоНоменклатуры/Forms/ФормаОбработки/Ext/Form/Module.bsl',
|
|
content: `&НаСервере
|
|
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
|
|
\tЗаполнитьУровень(Дерево.ПолучитьЭлементы(), Справочники.Номенклатура.ПустаяСсылка());
|
|
КонецПроцедуры
|
|
|
|
&НаСервере
|
|
Процедура ЗаполнитьУровень(КоллекцияЭлементов, Родитель)
|
|
\tЗапрос = Новый Запрос;
|
|
\tЗапрос.Текст =
|
|
\t\t"ВЫБРАТЬ
|
|
\t\t|\tСсылка, ЭтоГруппа, Цена, Наименование
|
|
\t\t|ИЗ
|
|
\t\t|\tСправочник.Номенклатура
|
|
\t\t|ГДЕ
|
|
\t\t|\tРодитель = &Родитель
|
|
\t\t|УПОРЯДОЧИТЬ ПО
|
|
\t\t|\tЭтоГруппа УБЫВ, Наименование";
|
|
\tЗапрос.УстановитьПараметр("Родитель", Родитель);
|
|
\tВыборка = Запрос.Выполнить().Выбрать();
|
|
\tПока Выборка.Следующий() Цикл
|
|
\t\tНовыйУзел = КоллекцияЭлементов.Добавить();
|
|
\t\tНовыйУзел.Номенклатура = Выборка.Ссылка;
|
|
\t\tНовыйУзел.Цена = Выборка.Цена;
|
|
\t\tЕсли Выборка.ЭтоГруппа Тогда
|
|
\t\t\tЗаполнитьУровень(НовыйУзел.ПолучитьЭлементы(), Выборка.Ссылка);
|
|
\t\tКонецЕсли;
|
|
\tКонецЦикла;
|
|
КонецПроцедуры
|
|
`,
|
|
},
|
|
|
|
// ── 4. DCS for report ──
|
|
// Сначала добавляем макет ОсновнаяСхемаКомпоновкиДанных к отчёту (регистрируется
|
|
// в Reports/ОстаткиТоваров.xml + автоматически выставляется MainDataCompositionSchema),
|
|
// затем skd-compile наполняет его содержимым.
|
|
{
|
|
name: 'template-add: ОсновнаяСхемаКомпоновкиДанных к отчёту ОстаткиТоваров',
|
|
script: 'template-add/scripts/add-template',
|
|
args: {
|
|
'-ObjectName': 'ОстаткиТоваров',
|
|
'-TemplateName': 'ОсновнаяСхемаКомпоновкиДанных',
|
|
'-TemplateType': 'DataCompositionSchema',
|
|
'-SrcDir': '{workDir}/Reports',
|
|
},
|
|
},
|
|
{
|
|
name: 'skd-compile: Схема отчёта ОстаткиТоваров',
|
|
script: 'skd-compile/scripts/skd-compile',
|
|
input: {
|
|
dataSets: [{
|
|
name: 'НаборДанных',
|
|
query: 'ВЫБРАТЬ\n\tТовары.Ссылка КАК Документ,\n\tТовары.Номенклатура КАК Номенклатура,\n\tТовары.Количество КАК Количество,\n\tТовары.Цена КАК Цена,\n\tТовары.Сумма КАК Сумма\nИЗ\n\tДокумент.ПриходнаяНакладная.Товары КАК Товары',
|
|
fields: [
|
|
{ field: 'Документ', title: 'Документ', type: 'DocumentRef.ПриходнаяНакладная' },
|
|
{ field: 'Номенклатура', title: 'Номенклатура', type: 'CatalogRef.Номенклатура' },
|
|
{ field: 'Количество', title: 'Количество', type: 'decimal(15,3)' },
|
|
{ field: 'Цена', title: 'Цена', type: 'decimal(15,2)' },
|
|
{ field: 'Сумма', title: 'Сумма', type: 'decimal(15,2)' },
|
|
],
|
|
}],
|
|
totalFields: ['Количество: Сумма', 'Сумма: Сумма'],
|
|
settingsVariants: [{
|
|
name: 'Основной',
|
|
title: 'Остатки товаров',
|
|
settings: {
|
|
selection: ['Номенклатура', 'Количество', 'Сумма', 'Auto'],
|
|
filter: ['Номенклатура = _ @off @user @quickAccess'],
|
|
structure: 'Номенклатура > details',
|
|
},
|
|
}],
|
|
},
|
|
args: { '-DefinitionFile': '{inputFile}', '-OutputPath': '{workDir}/Reports/ОстаткиТоваров/Templates/ОсновнаяСхемаКомпоновкиДанных/Ext/Template.xml' },
|
|
validate: { script: 'skd-validate/scripts/skd-validate', flag: '-TemplatePath', path: 'Reports/ОстаткиТоваров/Templates/ОсновнаяСхемаКомпоновкиДанных/Ext/Template.xml' },
|
|
},
|
|
|
|
// ── 5. Subsystems ──
|
|
{
|
|
name: 'subsystem-compile: Подсистема Склад',
|
|
script: 'subsystem-compile/scripts/subsystem-compile',
|
|
input: {
|
|
name: 'Склад',
|
|
synonym: 'Склад',
|
|
content: [
|
|
'Catalog.Организации',
|
|
'Catalog.Контрагенты',
|
|
'Catalog.КонтактныеЛица',
|
|
'Catalog.Номенклатура',
|
|
'Enum.ВидыНоменклатуры',
|
|
'Enum.КатегорииЦен',
|
|
'Enum.СпособыУчёта',
|
|
'Document.ПриходнаяНакладная',
|
|
'Report.ОстаткиТоваров',
|
|
],
|
|
},
|
|
args: { '-DefinitionFile': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'subsystem-validate/scripts/subsystem-validate', flag: '-SubsystemPath', path: 'Subsystems/Склад' },
|
|
},
|
|
{
|
|
name: 'subsystem-compile: Подсистема Администрирование',
|
|
script: 'subsystem-compile/scripts/subsystem-compile',
|
|
input: {
|
|
name: 'Администрирование',
|
|
synonym: 'Администрирование',
|
|
content: [
|
|
'InformationRegister.КурсыВалют',
|
|
'Constant.ОсновнаяВалюта',
|
|
'DataProcessor.ТестовыеОшибки',
|
|
'DataProcessor.ДеревоНоменклатуры',
|
|
],
|
|
},
|
|
args: { '-DefinitionFile': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'subsystem-validate/scripts/subsystem-validate', flag: '-SubsystemPath', path: 'Subsystems/Администрирование' },
|
|
},
|
|
|
|
// ── 6. Role with full rights ──
|
|
{
|
|
name: 'role-compile: Роль Администратор',
|
|
script: 'role-compile/scripts/role-compile',
|
|
input: {
|
|
name: 'Администратор',
|
|
objects: [
|
|
'Catalog.Организации: Read View Add Update Delete',
|
|
'Catalog.Контрагенты: Read View Add Update Delete',
|
|
'Catalog.КонтактныеЛица: Read View Add Update Delete',
|
|
'Catalog.Номенклатура: Read View Add Update Delete',
|
|
'Document.ПриходнаяНакладная: Read View Add Update Delete Posting UnPosting',
|
|
'InformationRegister.КурсыВалют: Read View Add Update Delete',
|
|
'Report.ОстаткиТоваров: Use View',
|
|
'DataProcessor.ДеревоНоменклатуры: Use View',
|
|
],
|
|
},
|
|
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
|
|
validate: { script: 'role-validate/scripts/role-validate', flag: '-RightsPath', path: 'Roles/Администратор' },
|
|
},
|
|
|
|
// ── 7. Final validation ──
|
|
// (meta-compile, subsystem-compile, role-compile уже регистрируют объекты в Configuration.xml)
|
|
{
|
|
name: 'cf-validate: Финальная валидация конфигурации',
|
|
script: 'cf-validate/scripts/cf-validate',
|
|
args: { '-ConfigPath': '{workDir}' },
|
|
},
|
|
];
|