Как создать plu код в 1с

Обновлено: 04.07.2024

н = 0;
МетаКоллекция = Метаданные["Документы"];
Для Каждого МетаДокумент из МетаКоллекция Цикл
н = н + 1;
Имя = МетаДокумент.Имя;

Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;

Тз = Результат.Выгрузить();
КонецФункции // ПолучитьИменаСуществующихДокументов

// ТипВозвращаемогоЗначения:
// 0 = список значений метаобъектов
Функция ПолучитьИменаРегистровНакопленияДвижений(ТипВозвращаемогоЗначения=0, ФлагСтрого=Истина)

Перем Запрос, Результат, Выборка, Сз;

Попытка
Результат = Запрос.Выполнить();
Исключение
Возврат Неопределено; // пожарный вариант (далее будет запвисеть от ФлагСтрого)
КонецПопытки;

Если ТипВозвращаемогоЗначения = 0 Тогда
КонецЕсли;

Сз = Новый СписокЗначений;

Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сз.Добавить(Выборка.Имя);
КонецЦикла;
Запрос = Неопределено;
Возврат Сз;

Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;

Перем Запрос, Результат, Выборка, Сз, х;

ТекстЗапроса = Запрос.Текст; // отладка

Попытка
Результат = Запрос.Выполнить();
Исключение
Возврат Неопределено; // пожарный вариант (далее будет запвисеть от ФлагСтрого)
КонецПопытки;

Сз = Новый СписокЗначений;

Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сз.Добавить(Выборка.Имя);
КонецЦикла;
Запрос = Неопределено;
Возврат Сз;

ФлагЗакрытьЭксель = Ложь;
Если Не Эксель.Visible Тогда
ФлагЗакрытьЭксель = Истина;
КонецЕсли;

Тз = Новый ТаблицаЗначений;

Колонка = Колонка + 1;
Значение = СокрЛП(Лист.Cells(Ряд, Колонка).Value);
КонецЦикла;

Ряд = Ряд + 1;
Значение = СокрЛП(Лист.Cells(Ряд, 1).Value);
КонецЦикла;

Если ФлагЗакрытьЭксель Тогда
Эксель.Quit();
КонецЕсли;

Возврат Тз;
КонецФункции // ТзИзЭкселя

Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл
//Объект = Выборка.ПолучитьОбъект();
Возврат Ложь;
КонецЦикла;
Возврат Истина;
КонецФункции // БитаяСсылка

Функция ПланОбменаСоставМиграция()
//х = Метаданные["ПланыОбмена"]["Полный"].Состав.Содержит(Метаданные["Справочники"]["Контрагенты"]);
//х = Метаданные["ПланыОбмена"]["Полный"].Состав.Содержит(Метаданные["Справочники"]["ГруппыПользователейТорговогоОборудования"]);
//Если Не Метаданные["ПланыОбмена"]["Полный"].Состав.Содержит(Метаданные["Справочники"][МетаОбъект.Имя]) Тогда
// Продолжить;
//КонецЕсли;
КонецФункции // ПланОбменаСоставМиграция

// 04.04.08
Функция ТзВЭксель(Тз, ИмяФайла, ФлагПерезаписать=Ложь) Экспорт
Перем Эксель, Книга, Лист, Ячейка, Ряд, к, Ид;

ФлагЗакрытьЭксель = Ложь;
Если Не Эксель.Visible Тогда
ФлагЗакрытьЭксель = Истина;
КонецЕсли;

Книга = Эксель.Workbooks.Add(); // новая книга
Лист = Книга.Worksheets(1);
Лист.Cells.Font.Size = 8; // по умолчанию

Для к = 1 По Тз.Колонки.Количество() Цикл
Лист.Cells(Ряд, к).Value = Строка(Тз.Колонки.Получить(к-1).Имя);
КонецЦикла;

Для Каждого СтрокаТз из Тз Цикл
ОбработкаПрерыванияПользователя();

Если ФлагЗакрытьЭксель Тогда
Эксель.Quit();
КонецЕсли;

// 24.04.08
Функция ЗагрузитьТзИзХмл(ИмяФайла, ИмяУзла) Экспорт

Для н = 1 По Узлы.Length Цикл
Узел = Узлы.Item(н-1);

Если Узел.tagName <> ИмяУзла Тогда
Продолжить;
КонецЕсли;

ФлагЕстьКолонка = 0;
Попытка
ЧернаяДыра = Тз.ПолучитьЗначение(Тз.НомерСтроки, Ид);
ФлагЕстьКолонка = 1;
Исключение
КонецПопытки;

Если ФлагНоваяСтрока = 0 Тогда
//Тз.НоваяСтрока();
СтрокаТз = Тз.Добавить();
ФлагНоваяСтрока = 1;
КонецЕсли;
//Тз.УстановитьЗначение(Тз.НомерСтроки, Ид, Атрибут.Value);
СтрокаТз[Ид] = Атрибут.Value;

ФлагЕстьКолонка = 0;
Попытка
//ЧернаяДыра = Тз.ПолучитьЗначение(Тз.НомерСтроки, Ид);
ЧернаяДыра = СтрокаТз[Ид];
ФлагЕстьКолонка = 1;
Исключение
КонецПопытки;

Если ФлагНоваяСтрока = 0 Тогда
Тз.НоваяСтрока();
ФлагНоваяСтрока = 1;
КонецЕсли;
//Тз.УстановитьЗначение(Тз.НомерСтроки, Ид, Подузел.Text);
СтрокаТз[Ид] = Подузел.Text;

Возврат Тз;
КонецФункции // ЗагрузитьТзИзХмл

Функция ПринадлежитПериоду(Дат, ДатаНачала, ДатаОкончания)
Если Не ЗначениеЗаполнено(Дат) Тогда
Возврат Ложь;
КонецЕсли;
Если ЗначениеЗаполнено(ДатаНачала) Тогда // указана дата начала
Если Дат < ДатаНачала Тогда
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(ДатаОкончания) Тогда // указана дата окончания
Если Дат > ДатаОкончания Тогда
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Возврат Истина;
КонецФункции // ПринадлежитПериоду

xlThin = 2;
xlMedium = -4138;
xlEdgeLeft = 7;
xlEdgeTop = 8;
xlEdgeBottom = 9;
xlEdgeRight = 10;

Excel.DisplayAlerts = 0; // False

КнигаДанные = Excel.Workbooks.Add(); // новая книга
Лист = КнигаДанные.Worksheets(1);

Тз.НоваяСтрока();
Тз.Объект = Лист.Cells(Ряд,1).Value; // вид документа
Ряд = Ряд + 1;
КонецЦикла;

Лист.Cells(2,1).Select(); // выделить ячейку

ExcelApp.Workbooks.Open(ИмяФайла,0,ТолькоЧтение);
ExcelApp.Calculation = -4135;// xlCalculationManual
ExcelApp.EnableAnimations = 0; // False
ExcelApp.DisplayAlerts = 0; // False
ExcelApp.ScreenUpdating = 0; // False
ExcelApp.DisplayStatusBar = 0; // False

Если Тз.ЭкономПлан <> ТекущийЭкономПлан Тогда

// Определим количество валют по текущему ЭП
СзВ.УдалитьВсе();
ТзВ.ВыбратьСтроки();
Пока ТзВ.ПолучитьСтроку() = 1 Цикл
Если ТзВ.ЭкономПлан <> Тз.ЭкономПлан Тогда
Продолжить;
КонецЕсли;

Если ТзВ.Валюта.Расчетная = 1 Тогда // доллар ЦБ + %
Продолжить; // т.к. в ходит в одну категорию с долларом ЦБ
КонецЕсли;

Ряд = (КолВалют+1+1)+1; // (для валют + пустая строка + шапка) + следующая строка
РядШапки = Ряд-1;
Ряд1 = Ряд; // для объединения ячеек с оператором

// Добавим параметры
КолонкаКурсов = 6;

Область = Лист.Range(Лист.Cells(1, 1), Лист.Cells(КолВалют, 7));
Область.Borders(7).Weight = 2; // xlLeft
Область.Borders(8).Weight = 2; // xlTop
Область.Borders(9).Weight = 2; // xlBotton
Область.Borders(10).Weight = 2; // xlRight
Область.Borders(11).Weight = 2; // xlInsideVertical
Область.Borders(12).Weight = 2; // xlInsideHorizontal

Область = Лист.Range(Лист.Cells(РядШапки, 1), Лист.Cells(РядШапки, 7));
Область.Font.Size = 10;
Область.Font.Bold = 1;

Книга.Windows(1).DisplayGridlines = 0;
Книга.Windows(1).Zoom = 120;
Лист.DisplayAutomaticPageBreaks = 0;
// (данные вмещается по ширине листа)

ТекущийЭкономПлан = Тз.ЭкономПлан;
КонецЕсли;

Если ПустоеЗначение(ВалютаСкидки) = 1 Тогда
Скидка = 0;
ФормулаСкидки = 0;
НомерЦветаСкидки = -4142; // нет цвета

// А теперь ввод строки закончен! :) Уф!
Ряд = Ряд + 1;
КонецЦикла; // по строкам Тз

// 12.08.10
Функция ПолучитьСвойствоОбъекта(Объект, КодСвойства) Экспорт

Если Не ЗначениеЗаполнено(Объект) Тогда
Возврат Неопределено;
КонецЕсли;

РезультатЗапроса = Запрос.Выполнить();
Тз = РезультатЗапроса.Выгрузить();

Если Тз.Количество() > 0 Тогда
Возврат Тз.Получить(0).Значение;
КонецЕсли;

Процедура Объединить(Лист, Ряд1, Колонка1, Ряд2, Колонка2)
Область = Лист.Range(Лист.Cells(Ряд1, Колонка1), Лист.Cells(Ряд2, Колонка2));
Область.Merge();
Область.HorizontalAlignment = -4108; // xlCenter
Область.VerticalAlignment = -4108; // xlCenter
Область.WrapText = 1;
КонецПроцедуры // Ячейка

Функция ОбластьЛиста(Лист, Ряд1, Колонка1, Ряд2, Колонка2)

Возврат Лист.Range(Лист.Cells(Ряд1,Колонка1), Лист.Cells(Ряд2,Колонка2));

Эксель.DisplayAlerts = 0; // False

Эксель.Visible = 1; // на период отладки
Книга = Эксель.Workbooks.Add(); // новая книга

//Эксель.Visible = 1; // на случай ускорения прорисовки

КонецПроцедуры // Создать КнигуЭксель

Процедура ЗаполнитьЛист(ТзПлан, Эксель, Книга, НомерЛиста, ИмяЛиста)

Лист = Книга.Worksheets(НомерЛиста);
//Sheets.Add After:=Sheets(Sheets.Count)
Лист.Name = ИмяЛиста;
Лист.Cells.Font.Size = 8; // по умолчанию

РядЗаголовка = 1;
РядПервыйТаблицы = РядЗаголовка + 3;
КолонкаНоменклатура = 1;
КолонкаПерваяТаблицы = КолонкаНоменклатура + 4;

НомерДаты = 1;
Дат = НачалоДня(НачПериода);
Пока Дат

Объединить(Лист, РядЗаголовка, КолонкаНоменклатура, РядЗаголовка+2, КолонкаНоменклатура);
Объединить(Лист, РядЗаголовка, КолонкаНоменклатура+1, РядЗаголовка+2, КолонкаНоменклатура+1);
Объединить(Лист, РядЗаголовка, КолонкаНоменклатура+2, РядЗаголовка+2, КолонкаНоменклатура+2);
Объединить(Лист, РядЗаголовка, КолонкаНоменклатура+3, РядЗаголовка+2, КолонкаНоменклатура+3);

Дат = НачалоДня(Дат + 60 * 60 * 24);
НомерДаты = НомерДаты + 1;
КонецЦикла;

// Вывод таблицы
Тз = ТзПлан; // для удобства

НомСтр = 0;
Для Каждого СтрокаТз из Тз Цикл

// отладка
//Если НомСтр > 5 Тогда
// Прервать;
//КонецЕсли;

Если СтрокаТз.НомерЛиста <> НомерЛиста Тогда
Продолжить;
КонецЕсли;

НомСтр = НомСтр + 1;

Код = СтрокаТз.Код;
Номенклатура = СтрокаТз.Номенклатура;
КолПлан = СтрокаТз.КолПлан;

Ряд = РядПервыйТаблицы + (НомСтр-1);

НомерДаты = 1;
Дат = НачалоДня(НачПериода);
Пока Дат

Ид = ИдПоДате(Дат);
КолПланДня = СтрокаТз[Ид];

Дат = НачалоДня(Дат + 60 * 60 * 24);
НомерДаты = НомерДаты + 1;
КонецЦикла; // по колонкам дней

КонецЦикла; // по списку номенклатуры

Дат = НачалоДня(Дат + 60 * 60 * 24);
НомерДаты = НомерДаты + 1;
КонецЦикла; // по колонкам дней

Колонка2 = КолонкаПерваяТаблицы+3*(НомерДаты-1)-1;
Область = ОбластьЛиста(Лист, 1, 1, РядПервыйТаблицы+(НомСтр-1), Колонка2);
Область.Borders(7).Weight = 2; // xlLeft
Область.Borders(8).Weight = 2; // xlTop
Область.Borders(9).Weight = 2; // xlBotton
Область.Borders(10).Weight = 2; // xlRight
Область.Borders(11).Weight = 2; // xlInsideVertical
Область.Borders(12).Weight = 2; // xlInsideHorizontal

Область = ОбластьЛиста(Лист, 1, 1, 1, 1);
Область.Select(); // вернемся в угло листа

//Эксель.ActiveWindow.DisplayZeros = 0;
Окно = Книга.Windows(1);
Окно.DisplayZeros = 0;
Окно.SplitRow = 3;
Окно.SplitColumn = 4;
Окно.FreezePanes = -1; // Tree

//expression.Add(Type, AlertStyle, Operator, Formula1, Formula2)

//Книга.Windows(1).DisplayGridlines = 0;
//Книга.Windows(1).Zoom = 120;
//Лист.DisplayAutomaticPageBreaks = 0;

РезультатЗапроса = Запрос.Выполнить();
Тз = РезультатЗапроса.Выгрузить();
//Сообщить(Тз.Количество());

// Заполнение справочника Роли
сСпр = гСоединение.Справочники.Роли;
Для Каждого Роль из Метаданные.Роли Цикл
сЭлемент = сСпр.СоздатьЭлемент();
сЭлемент.Наименование = Роль.Имя;
сЭлемент.Порядок = Метаданные.Роли.Индекс(Роль)+1;
сЭлемент.Записать();

сРезультатЗапроса = сЗапрос.Выполнить();
сТз = сРезультатЗапроса.Выгрузить();

Если сТз.Количество() = 0 Тогда
Возврат;
КонецЕсли;

сОбъект = сСтрокаТз.Ссылка.ПолучитьОбъект();
сОбъект.УстановитьПометкуУдаления(Истина);
КонецЦикла;

сНз = гСоединение.РегистрыБухгалтерии.Налоговый.СоздатьНаборЗаписей();
сНз.Отбор.Регистратор.Установить(сДокумент.Ссылка);

Для Каждого СтрокаТз из Тз Цикл

Если НачалоМесяца(СтрокаТз.ДатаПериода) <> НачалоМесяца(Дата1) Тогда
Продолжить;
КонецЕсли;

Функция Word_Замена() Экспорт

// 1) сделать замену строки ЭтотОбъект.Ссылка на ЭтотОбъектСсылка
// После заменить ЭтотОбъект. на пустую строку

Ворд.Visible = Истина;
Ворд.Documents.Open(ИмяФайла);

//Function Execute([FindText], [MatchCase], [MatchWholeWord], [MatchWildcards], [MatchSoundsLike], [MatchAllWordForms], [Forward], [Wrap], [Format], [ReplaceWith], [Replace], [MatchKashida], [MatchDiacritics], [MatchAlefHamza], [MatchControl]) As Boolean
// Function Execute(. , , , )

Поиск.Execute(. , 2, , , , ); // wdReplaceAll

Функция ПолучитьРасширениеКартинки(х) Экспорт
Перем СтрРасширение, ФорматК;

Функция ПолучитьРазмерКартинки(оКартинка) Экспорт
Перем ИмяФайла;

Кол = 1;
Пока Иэ.Busy Цикл
//Пауза();
Кол = Кол + 1;
Если Кол > 3 Тогда
Прервать;
КонецЕсли;
КонецЦикла;

Функция УстановитьЗначениеСвойстваНоменклатуры(Объект, ИмяСвойства, Значение) Экспорт

Если Объект.Пустая() Тогда
Возврат Неопределено;
КонецЕсли;

нзЗначенияСвойств = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
нзЗначенияСвойств.Отбор.Объект.Установить(Объект);
нзЗначенияСвойств.Отбор.Свойство.Установить(оСвойство);

функция ПолучитьЗначениеСвойстваНоменклатуры(Объект, ИмяСвойства) экспорт
Перем Запрос;

если РезультатЗапроса.Следующий() тогда

Функция ПолучитьЗначениеСвойства(Свойство, СтрЗначение) Экспорт

если Не ЗначениеЗаполнено(Свойство) тогда
Возврат Справочники.ЗначенияСвойствОбъектов.ПустаяСсылка();
конецЕсли;

Если ПустаяСтрока(СтрЗначение) Тогда
Возврат Справочники.ЗначенияСвойствОбъектов.ПустаяСсылка();
КонецЕсли;

РезультатЗапроса = Запрос.Выполнить();
Тз = РезультатЗапроса.Выгрузить();
//Дз = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

л = СтрДлина(СтрЗначение);
//л = СтрДлина(СтрЗначение)-1; // пожарный вариант

// можно улучшить
// выбрать не помеченные, если нет, то получить помеченный
Для Каждого СтрокаТз из Тз Цикл

//Если х = НРег(СокрЛП(СтрЗначение)) Тогда
Если Лев(х, л) = Лев(НРег(СокрЛП(СтрЗначение)), л) Тогда // пожарный вариант
Возврат СтрокаТз.Ссылка;
КонецЕсли;

КонецЦикла; // не нашли

Функция СоздатьСвойствоНоменклатуры(ИмяСвойства) Экспорт

ЧтениеXML = Новый ЧтениеXML;

т1 = ТекущаяДата();
ЧтениеXML.ОткрытьФайл(гПуть);

т1 = ТекущаяДата();
ЧтениеXML.ОткрытьФайл(гПуть);

мСтек = Новый Массив(100); // в стеке храним Ид родителей и обращаемся к массиву только при смене родителя

//1 ELEMENT_NODE
//2 ATTRIBUTE_NODE
//3 TEXT_NODE
//4 CDATA_SECTION_NODE
//5 ENTITY_REFERENCE_NODE
//6 ENTITY_NODE
//7 PROCESSING_INSTRUCTION_NODE
//8 COMMENT_NODE
//9 DOCUMENT_NODE
//10 DOCUMENT_TYPE_NODE
//11 DOCUMENT_FRAGMENT_NODE
//12 NOTATION_NODE

Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда // новый элемент
РазмерСтека = РазмерСтека + 1;
Ид = Ид + 1;

мСтек.Установить(РазмерСтека, Ид);
ИдРодителя = Ид;

// откроем (увеличим) стек
Если РазмерСтека > РазмерСтекаПик Тогда
РазмерСтекаПик = РазмерСтека;
КонецЕсли;
//СтрокаБ.Уровень = ТзСтек.Количество()-1;

//мСтек.Установить(РазмерСтека, Ид);
ИдРодителя = мСтек.Получить(РазмерСтека);

ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
Ид = Ид + 1;

ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Атрибут Тогда
Ид = Ид + 1;

ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Комментарий Тогда
Ид = Ид + 1;

Иначе
Ид = Ид + 1;

КонецЦикла; // по элементам xml-файла

т2 = ТекущаяДата();
дт2 = т2-т1;

СтрокаТз = Тз.Добавить();
СтрокаТз.Файл = Файл;
СтрокаТз.Путь = Файл.ПолноеИмя;
СтрокаТз.Имя = Файл.Имя;

Возврат Тз;
КонецФункции // ПолучитьСписокФайлов

Функция URLEncode( value )

length = СтрДлина( value );

Для i = 1 По length Цикл
symbol = Сред( value, i, 1 );
//code = КодСимвола( symbol );
code = КодСимволаASCII( symbol );
result = result + Сред( table, code*3 + 1, 3 );
КонецЦикла;

Возврат result;
КонецФункции

Если Не ЗначениеЗаполнено(Документ1) или Не ЗначениеЗаполнено(Документ2) Тогда
Возврат Неопределено;
КонецЕсли;

РезультатЗапроса = Запрос.Выполнить();
Тз = РезультатЗапроса.Выгрузить();
//Дз = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
Если Тз.Количество() <> 2 Тогда
Возврат Неопределено;
ИначеЕсли Тз[0].Ссылка = Документ1 Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;

пОбработка = Приложение.ВнешниеОбработки.Создать(ИмяОбработки);
пОбработка.Авто = Истина;
пОбработка.Дата1 = НачПериода;
пОбработка.Дата2 = КонПериода;
пОбработка.ПолучитьФорму().Открыть();

Читайте также: