1.3.1.112: CSV таблиц и файловый лог с режимом клиент/сервер (#29).

Путь выгрузки, выгрузка own/comm в CSV, флажок сеансового лога «Создать документы», выбор записи файлов на клиенте или на сервере 1С.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
mihailkudravcev
2026-09-03 11:45:05 +03:00
parent d35efb2b72
commit 53a319c106
8 changed files with 599 additions and 9 deletions
+10
View File
@@ -4,6 +4,16 @@
--- ---
## 1.3.1.112 (2026-09-03)
### РК_ЗагрузкаОстатков — CSV таблиц и файловый лог (#29)
- Реквизит `ПутьКФайламВыгрузкиТаблиц` (сохраняется между сеансами) + выбор каталога.
- Реквизит `РежимЗаписиФайловВыгрузки`: **Клиент** / **Сервер** (сохраняется); CSV и логи пишутся на выбранной стороне.
- Команда «Выгрузить таблицы в CSV»: own + comm, UTF-8, уникальные имена `crm-dev_to_crm3-26_*_yyyy-MM-dd_HHmmss.csv`.
- Флажок формы `ПисатьЛогиВПапку` (не сохраняется, по умолчанию выкл.): подробный протокол «Создать документы» (тест/запись) в `.log` в том же каталоге.
- Режим «Сервер»: путь — каталог/UNC, доступный серверу 1С; диалог выбора каталога клиента недоступен (подсказка).
## 1.3.1.111 (2026-09-03) ## 1.3.1.111 (2026-09-03)
### РК_ЗагрузкаОстатков — договор комиссии 2.5 (#34) ### РК_ЗагрузкаОстатков — договор комиссии 2.5 (#34)
+1 -1
View File
@@ -1 +1 @@
1.3.1.111 1.3.1.112
+6 -4
View File
@@ -57,7 +57,7 @@
<Metadata name="DataProcessor.ЗагрузкаДанныхИзФайла.Form.ЗагрузкаДанныхИзФайла" id="f47d02ff-17f2-4764-a151-627f4067a479" configVersion="247298ad849a4d46b1f412e90c0184fe64756489"/> <Metadata name="DataProcessor.ЗагрузкаДанныхИзФайла.Form.ЗагрузкаДанныхИзФайла" id="f47d02ff-17f2-4764-a151-627f4067a479" configVersion="247298ad849a4d46b1f412e90c0184fe64756489"/>
<Metadata name="DataProcessor.ЗагрузкаДанныхИзФайла.Form.ЗагрузкаДанныхИзФайла.Form" id="f47d02ff-17f2-4764-a151-627f4067a479.0" configVersion="e853a6b3591994346f9ce1d3b7d5cf0daf864fb8"/> <Metadata name="DataProcessor.ЗагрузкаДанныхИзФайла.Form.ЗагрузкаДанныхИзФайла.Form" id="f47d02ff-17f2-4764-a151-627f4067a479.0" configVersion="e853a6b3591994346f9ce1d3b7d5cf0daf864fb8"/>
<Metadata name="DataProcessor.ЗагрузкаДанныхИзФайла.ManagerModule" id="b6fd11ac-f702-4d13-b328-9a78b0874483.2" configVersion="78276e2de46cee0ce6ddd3972858ba87a64b96c0"/> <Metadata name="DataProcessor.ЗагрузкаДанныхИзФайла.ManagerModule" id="b6fd11ac-f702-4d13-b328-9a78b0874483.2" configVersion="78276e2de46cee0ce6ddd3972858ba87a64b96c0"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков" id="5922bda8-8f69-487c-823a-8b09e343f59a" configVersion="ee2ec7d46a31579a407dc18d2c6621f681d00561"> <Metadata name="DataProcessor.РК_ЗагрузкаОстатков" id="5922bda8-8f69-487c-823a-8b09e343f59a" configVersion="5cf7af6dad46b008d3e4349d85612dbf1c629e27">
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ВходящиеКомиссионныеТовары.Attribute.СтоимостьРегл" id="068e3fcc-0bd5-4af0-a192-d100909a8cc1"/> <Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ВходящиеКомиссионныеТовары.Attribute.СтоимостьРегл" id="068e3fcc-0bd5-4af0-a192-d100909a8cc1"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ВходящиеСобственныеТовары.Attribute.СкладИдентификатор" id="086673fd-91b2-4966-8472-144da87650e6"/> <Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ВходящиеСобственныеТовары.Attribute.СкладИдентификатор" id="086673fd-91b2-4966-8472-144da87650e6"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ВходящиеСобственныеТовары.Attribute.КомментарийСопоставления" id="09d80a73-1aa6-4ecc-a39a-c667e99e3084"/> <Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ВходящиеСобственныеТовары.Attribute.КомментарийСопоставления" id="09d80a73-1aa6-4ecc-a39a-c667e99e3084"/>
@@ -176,6 +176,8 @@
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.Attribute.ПодключениеКСтороннейБазе" id="d8202194-9b79-46e4-b922-34f7c3add55c"/> <Metadata name="DataProcessor.РК_ЗагрузкаОстатков.Attribute.ПодключениеКСтороннейБазе" id="d8202194-9b79-46e4-b922-34f7c3add55c"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.СозданныеДокументы.Attribute.Соглашение" id="e1a6c9d2-5f07-4619-8c3e-a3847bc5e690"/> <Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.СозданныеДокументы.Attribute.Соглашение" id="e1a6c9d2-5f07-4619-8c3e-a3847bc5e690"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.Attribute.СоздаватьЗаглушкиСерий" id="e41a311b-b962-4888-ab06-c8ee29eb6351"/> <Metadata name="DataProcessor.РК_ЗагрузкаОстатков.Attribute.СоздаватьЗаглушкиСерий" id="e41a311b-b962-4888-ab06-c8ee29eb6351"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.Attribute.ПутьКФайламВыгрузкиТаблиц" id="82f9884b-f782-4b29-af1c-3512694ede64"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.Attribute.РежимЗаписиФайловВыгрузки" id="28583859-cefe-4f6e-be17-c6973face4f5"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ПолитикаУчетаНоменклатуры.Attribute.ВидНоменклатурыНаименование" id="e4d84e8b-fbd4-4967-9f84-67622403de0a"/> <Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ПолитикаУчетаНоменклатуры.Attribute.ВидНоменклатурыНаименование" id="e4d84e8b-fbd4-4967-9f84-67622403de0a"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ОтборСкладовВнешнейБазы" id="e7012345-a678-4bcd-9ef0-123456789abc"/> <Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ОтборСкладовВнешнейБазы" id="e7012345-a678-4bcd-9ef0-123456789abc"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ОтборСкладовВнешнейБазы.Attribute.Идентификатор" id="e7012345-a678-4bcd-9ef0-123456789abe"/> <Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ОтборСкладовВнешнейБазы.Attribute.Идентификатор" id="e7012345-a678-4bcd-9ef0-123456789abe"/>
@@ -201,9 +203,9 @@
</Metadata> </Metadata>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.Form.ПодборСкладов" id="9dfcb2a8-bf22-44c3-97a7-a69f70ca4d61" configVersion="3bf7d51ed9ee398e1704b692c5cf543de885b35d"/> <Metadata name="DataProcessor.РК_ЗагрузкаОстатков.Form.ПодборСкладов" id="9dfcb2a8-bf22-44c3-97a7-a69f70ca4d61" configVersion="3bf7d51ed9ee398e1704b692c5cf543de885b35d"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.Form.ПодборСкладов.Form" id="9dfcb2a8-bf22-44c3-97a7-a69f70ca4d61.0" configVersion="8cddcd809beef075b470c32dd5564aebb81e405c"/> <Metadata name="DataProcessor.РК_ЗагрузкаОстатков.Form.ПодборСкладов.Form" id="9dfcb2a8-bf22-44c3-97a7-a69f70ca4d61.0" configVersion="8cddcd809beef075b470c32dd5564aebb81e405c"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.Form.Форма" id="dc49348d-9257-4545-9c29-70c138312177" configVersion="4541c8c382171c6c02021bcc8f500135f4358aa8"/> <Metadata name="DataProcessor.РК_ЗагрузкаОстатков.Form.Форма" id="dc49348d-9257-4545-9c29-70c138312177" configVersion="4b1376c92cb4d29bf8988c9421235ef3cf31f0b7"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.Form.Форма.Form" id="dc49348d-9257-4545-9c29-70c138312177.0" configVersion="3f9b96e3b263b978e4086e5e52f6d507782d1219"/> <Metadata name="DataProcessor.РК_ЗагрузкаОстатков.Form.Форма.Form" id="dc49348d-9257-4545-9c29-70c138312177.0" configVersion="1c0bcc3797d32496f768807785da9f2e4780769b"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.ObjectModule" id="5922bda8-8f69-487c-823a-8b09e343f59a.0" configVersion="cba289096a89424fc3d851e10751d80517baf0e1"/> <Metadata name="DataProcessor.РК_ЗагрузкаОстатков.ObjectModule" id="5922bda8-8f69-487c-823a-8b09e343f59a.0" configVersion="d67564ee9b92b0817ea68a2eb2cad2773de572f3"/>
<Metadata name="DataProcessor.РК_ЗагрузкаЦен" id="a18e1801-18e0-4000-8000-000000000001" configVersion="800c7286acdc6bcc40d47f7aa70bdf0f18e2aa5d"> <Metadata name="DataProcessor.РК_ЗагрузкаЦен" id="a18e1801-18e0-4000-8000-000000000001" configVersion="800c7286acdc6bcc40d47f7aa70bdf0f18e2aa5d">
<Metadata name="DataProcessor.РК_ЗагрузкаЦен.Attribute.ПодключениеКСтороннейБазе" id="a18e1801-18e0-4000-8000-000000000101"/> <Metadata name="DataProcessor.РК_ЗагрузкаЦен.Attribute.ПодключениеКСтороннейБазе" id="a18e1801-18e0-4000-8000-000000000101"/>
<Metadata name="DataProcessor.РК_ЗагрузкаЦен.Attribute.ДатаЦен" id="a18e1801-18e0-4000-8000-000000000102"/> <Metadata name="DataProcessor.РК_ЗагрузкаЦен.Attribute.ДатаЦен" id="a18e1801-18e0-4000-8000-000000000102"/>
+1 -1
View File
@@ -62,7 +62,7 @@
<xr:Item xsi:type="xr:MDObjectRef">Role.РК_ОсновнаяРоль</xr:Item> <xr:Item xsi:type="xr:MDObjectRef">Role.РК_ОсновнаяРоль</xr:Item>
</DefaultRoles> </DefaultRoles>
<Vendor/> <Vendor/>
<Version>1.3.1.111</Version> <Version>1.3.1.112</Version>
<DefaultStyle/> <DefaultStyle/>
<DefaultLanguage>Language.Русский</DefaultLanguage> <DefaultLanguage>Language.Русский</DefaultLanguage>
<BriefInformation/> <BriefInformation/>
@@ -238,6 +238,82 @@
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput> <ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
</Properties> </Properties>
</Attribute> </Attribute>
<Attribute uuid="82f9884b-f782-4b29-af1c-3512694ede64">
<Properties>
<Name>ПутьКФайламВыгрузкиТаблиц</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Путь к файлам выгрузки таблиц</v8:content>
</v8:item>
</Synonym>
<Comment>Каталог для CSV таблиц и файловых логов (#29)</Comment>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>0</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</Type>
<PasswordMode>false</PasswordMode>
<Format/>
<EditFormat/>
<ToolTip/>
<MarkNegatives>false</MarkNegatives>
<Mask/>
<MultiLine>false</MultiLine>
<ExtendedEdit>false</ExtendedEdit>
<MinValue xsi:nil="true"/>
<MaxValue xsi:nil="true"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
</Properties>
</Attribute>
<Attribute uuid="28583859-cefe-4f6e-be17-c6973face4f5">
<Properties>
<Name>РежимЗаписиФайловВыгрузки</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Режим записи файлов</v8:content>
</v8:item>
</Synonym>
<Comment>Клиент или Сервер (#29)</Comment>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>20</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</Type>
<PasswordMode>false</PasswordMode>
<Format/>
<EditFormat/>
<ToolTip/>
<MarkNegatives>false</MarkNegatives>
<Mask/>
<MultiLine>false</MultiLine>
<ExtendedEdit>false</ExtendedEdit>
<MinValue xsi:nil="true"/>
<MaxValue xsi:nil="true"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
</Properties>
</Attribute>
<TabularSection uuid="11e438df-e73c-44d2-b3ed-08c04b320d8e"> <TabularSection uuid="11e438df-e73c-44d2-b3ed-08c04b320d8e">
<InternalInfo> <InternalInfo>
<xr:GeneratedType name="DataProcessorTabularSection.РК_ЗагрузкаОстатков.ВходящиеСобственныеТовары" category="TabularSection"> <xr:GeneratedType name="DataProcessorTabularSection.РК_ЗагрузкаОстатков.ВходящиеСобственныеТовары" category="TabularSection">
@@ -408,6 +408,7 @@
Результат.Вставить("Пропущено", 0); Результат.Вставить("Пропущено", 0);
Результат.Вставить("Ошибок", 0); Результат.Вставить("Ошибок", 0);
Результат.Вставить("ТекстТега", ""); Результат.Вставить("ТекстТега", "");
Результат.Вставить("Протокол", Новый Массив);
Если Не ЗначениеЗаполнено(Организация) Тогда Если Не ЗначениеЗаполнено(Организация) Тогда
ВызватьИсключение "Укажите организацию для документов ввода остатков"; ВызватьИсключение "Укажите организацию для документов ввода остатков";
@@ -418,15 +419,25 @@
ТекстТега = ТегКомментарияДокументов(); ТекстТега = ТегКомментарияДокументов();
Результат.ТекстТега = ТекстТега; Результат.ТекстТега = ТекстТега;
ДобавитьСтрокуПротокола(Результат, "=== Создать документы ввода остатков ===");
ДобавитьСтрокуПротокола(Результат, "Режим: " + ?(РежимТест, "тест (без записи)", "запись"));
ДобавитьСтрокуПротокола(Результат, "Организация: " + СокрЛП(Строка(Организация)));
ДобавитьСтрокуПротокола(Результат, "Дата документов: " + Формат(ДатаДокументовВвода, "ДЛФ=DT"));
ДобавитьСтрокуПротокола(Результат, "Тег: " + ТекстТега);
ДобавитьСтрокуПротокола(Результат, "Примечание: команда выполняет Запись документов, проведение — отдельно.");
СозданныеДокументы.Очистить(); СозданныеДокументы.Очистить();
СтрокиПоСкладу = СгруппироватьСопоставленныеСтрокиПоСкладу(); СтрокиПоСкладу = СгруппироватьСопоставленныеСтрокиПоСкладу();
СтрокиКомиссии = СгруппироватьСопоставленныеСтрокиКомиссии(); СтрокиКомиссии = СгруппироватьСопоставленныеСтрокиКомиссии();
ДобавитьСтрокуПротокола(Результат, "Групп own (складов): " + Формат(СтрокиПоСкладу.Количество(), "ЧН=0; ЧГ=0")
+ "; групп comm: " + Формат(СтрокиКомиссии.Количество(), "ЧН=0; ЧГ=0"));
Если ПерезаписатьДокументы И Не РежимТест Если ПерезаписатьДокументы И Не РежимТест
И (СтрокиПоСкладу.Количество() > 0 Или СтрокиКомиссии.Количество() > 0) Тогда И (СтрокиПоСкладу.Количество() > 0 Или СтрокиКомиссии.Количество() > 0) Тогда
ДобавитьСтрокуПротокола(Результат, "Удаление прежних документов волны…");
Результат.УдаленоДокументов = УдалитьПрежниеДокументыВолны(ТекстТега); Результат.УдаленоДокументов = УдалитьПрежниеДокументыВолны(ТекстТега);
ДобавитьСтрокуПротокола(Результат, "Удалено документов: " + Формат(Результат.УдаленоДокументов, "ЧН=0; ЧГ=0"));
КонецЕсли; КонецЕсли;
Для Каждого ЭлементСклада Из СтрокиПоСкладу Цикл Для Каждого ЭлементСклада Из СтрокиПоСкладу Цикл
@@ -437,15 +448,19 @@
Продолжить; Продолжить;
КонецЕсли; КонецЕсли;
Контекст = "own / склад " + СокрЛП(Строка(СкладДок))
+ " / строк " + Формат(СтрокиСклада.Количество(), "ЧН=0; ЧГ=0");
Попытка Попытка
Если РежимТест Тогда Если РежимТест Тогда
Результат.СозданоДокументов = Результат.СозданоДокументов + 1; Результат.СозданоДокументов = Результат.СозданоДокументов + 1;
Результат.СтрокВДокументах = Результат.СтрокВДокументах + СтрокиСклада.Количество(); Результат.СтрокВДокументах = Результат.СтрокВДокументах + СтрокиСклада.Количество();
ДобавитьВСозданныеДокументы(Неопределено, "Собственные", СкладДок, ДобавитьВСозданныеДокументы(Неопределено, "Собственные", СкладДок,
Неопределено, Неопределено, СтрокиСклада, ТекстТега + ", склад " + СокрЛП(Строка(СкладДок)), Истина); Неопределено, Неопределено, СтрокиСклада, ТекстТега + ", склад " + СокрЛП(Строка(СкладДок)), Истина);
ДобавитьСтрокуПротокола(Результат, "[TEST] " + Контекст);
Продолжить; Продолжить;
КонецЕсли; КонецЕсли;
ДобавитьСтрокуПротокола(Результат, "[FILL] " + Контекст);
Док = СоздатьДокументПоСкладу(СкладДок, СтрокиСклада, ТекстТега); Док = СоздатьДокументПоСкладу(СкладДок, СтрокиСклада, ТекстТега);
Если ЗначениеЗаполнено(Док) Тогда Если ЗначениеЗаполнено(Док) Тогда
Результат.СозданоДокументов = Результат.СозданоДокументов + 1; Результат.СозданоДокументов = Результат.СозданоДокументов + 1;
@@ -456,9 +471,16 @@
КонецЦикла; КонецЦикла;
ДобавитьВСозданныеДокументы(Док.Ссылка, "Собственные", СкладДок, ДобавитьВСозданныеДокументы(Док.Ссылка, "Собственные", СкладДок,
Неопределено, Неопределено, СтрокиСклада, Док.Комментарий, Ложь); Неопределено, Неопределено, СтрокиСклада, Док.Комментарий, Ложь);
ДобавитьСтрокуПротокола(Результат, "[WRITE] " + Контекст
+ " → " + СокрЛП(Строка(Док.Ссылка))
+ "; товаров=" + Формат(Док.Товары.Количество(), "ЧН=0; ЧГ=0"));
Иначе
ДобавитьСтрокуПротокола(Результат, "[SKIP] " + Контекст + " — пустой документ");
КонецЕсли; КонецЕсли;
Исключение Исключение
Результат.Ошибок = Результат.Ошибок + 1; Результат.Ошибок = Результат.Ошибок + 1;
ДобавитьСтрокуПротокола(Результат, "[ERROR] " + Контекст + ": "
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки; КонецПопытки;
КонецЦикла; КонецЦикла;
@@ -470,17 +492,23 @@
Продолжить; Продолжить;
КонецЕсли; КонецЕсли;
Первая = СтрокиГруппы[0];
Контекст = "comm / партнёр " + СокрЛП(Строка(Первая.Партнер))
+ " / соглашение " + СокрЛП(Строка(Первая.Соглашение))
+ " / договор " + СокрЛП(Строка(Первая.Договор))
+ " / строк " + Формат(СтрокиГруппы.Количество(), "ЧН=0; ЧГ=0");
Попытка Попытка
Если РежимТест Тогда Если РежимТест Тогда
Результат.СозданоДокументовКомиссии = Результат.СозданоДокументовКомиссии + 1; Результат.СозданоДокументовКомиссии = Результат.СозданоДокументовКомиссии + 1;
Результат.СтрокКомиссии = Результат.СтрокКомиссии + СтрокиГруппы.Количество(); Результат.СтрокКомиссии = Результат.СтрокКомиссии + СтрокиГруппы.Количество();
Первая = СтрокиГруппы[0];
ДобавитьВСозданныеДокументы(Неопределено, "Комиссия 2.5", Неопределено, ДобавитьВСозданныеДокументы(Неопределено, "Комиссия 2.5", Неопределено,
Первая.Соглашение, Первая.Партнер, СтрокиГруппы, Первая.Соглашение, Первая.Партнер, СтрокиГруппы,
ТекстТега + ", комиссия 2.5, " + СокрЛП(Строка(Первая.Партнер)), Истина); ТекстТега + ", комиссия 2.5, " + СокрЛП(Строка(Первая.Партнер)), Истина);
ДобавитьСтрокуПротокола(Результат, "[TEST] " + Контекст);
Продолжить; Продолжить;
КонецЕсли; КонецЕсли;
ДобавитьСтрокуПротокола(Результат, "[FILL] " + Контекст);
Док = СоздатьДокументКомиссии(СтрокиГруппы, ТекстТега); Док = СоздатьДокументКомиссии(СтрокиГруппы, ТекстТега);
Если ЗначениеЗаполнено(Док) Тогда Если ЗначениеЗаполнено(Док) Тогда
Результат.СозданоДокументовКомиссии = Результат.СозданоДокументовКомиссии + 1; Результат.СозданоДокументовКомиссии = Результат.СозданоДокументовКомиссии + 1;
@@ -491,21 +519,109 @@
КонецЦикла; КонецЦикла;
ДобавитьВСозданныеДокументы(Док.Ссылка, "Комиссия 2.5", Неопределено, ДобавитьВСозданныеДокументы(Док.Ссылка, "Комиссия 2.5", Неопределено,
Док.СоглашениеСКомиссионером, Док.Партнер, СтрокиГруппы, Док.Комментарий, Ложь); Док.СоглашениеСКомиссионером, Док.Партнер, СтрокиГруппы, Док.Комментарий, Ложь);
ДобавитьСтрокуПротокола(Результат, "[WRITE] " + Контекст
+ " → " + СокрЛП(Строка(Док.Ссылка))
+ "; товаров=" + Формат(Док.Товары.Количество(), "ЧН=0; ЧГ=0")
+ "; договор=" + СокрЛП(Строка(Док.Договор)));
Иначе
ДобавитьСтрокуПротокола(Результат, "[SKIP] " + Контекст + " — пустой документ");
КонецЕсли; КонецЕсли;
Исключение Исключение
Результат.Ошибок = Результат.Ошибок + 1; Результат.Ошибок = Результат.Ошибок + 1;
ДобавитьСтрокуПротокола(Результат, "[ERROR] " + Контекст + ": "
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки; КонецПопытки;
КонецЦикла; КонецЦикла;
ДобавитьСтрокуПротокола(Результат, "=== Итог ===");
ДобавитьСтрокуПротокола(Результат, "Own док.: " + Формат(Результат.СозданоДокументов, "ЧН=0; ЧГ=0")
+ " (" + Формат(Результат.СтрокВДокументах, "ЧН=0; ЧГ=0") + " стр.); comm: "
+ Формат(Результат.СозданоДокументовКомиссии, "ЧН=0; ЧГ=0")
+ " (" + Формат(Результат.СтрокКомиссии, "ЧН=0; ЧГ=0") + " стр.); удалено: "
+ Формат(Результат.УдаленоДокументов, "ЧН=0; ЧГ=0")
+ "; ошибок: " + Формат(Результат.Ошибок, "ЧН=0; ЧГ=0"));
Возврат Результат; Возврат Результат;
КонецФункции КонецФункции
// CSV-текст ТЧ обработки (UTF-8 готовит вызывающий при записи файла).
//
Функция ТекстCSVТабличнойЧасти(ИмяТЧ) Экспорт
Если ИмяТЧ <> "ВходящиеСобственныеТовары" И ИмяТЧ <> "ВходящиеКомиссионныеТовары" Тогда
ВызватьИсключение "Неизвестная табличная часть: " + ИмяТЧ;
КонецЕсли;
Таблица = ЭтотОбъект[ИмяТЧ];
МетаТЧ = Метаданные.Обработки.РК_ЗагрузкаОстатков.ТабличныеЧасти[ИмяТЧ];
ИменаКолонок = Новый Массив;
Для Каждого Рекв Из МетаТЧ.Реквизиты Цикл
ИменаКолонок.Добавить(Рекв.Имя);
КонецЦикла;
Строки = Новый Массив;
Строки.Добавить(СтрСоединить(ИменаКолонок, ";"));
Для Каждого СтрТ Из Таблица Цикл
Значения = Новый Массив;
Для Каждого ИмяКол Из ИменаКолонок Цикл
Значения.Добавить(ЗначениеДляCSV(СтрТ[ИмяКол]));
КонецЦикла;
Строки.Добавить(СтрСоединить(Значения, ";"));
КонецЦикла;
Возврат СтрСоединить(Строки, Символы.ПС);
КонецФункции
#КонецОбласти #КонецОбласти
#Область СлужебныеПроцедурыИФункции #Область СлужебныеПроцедурыИФункции
Процедура ДобавитьСтрокуПротокола(Результат, Текст)
Если ТипЗнч(Результат) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
Если Не Результат.Свойство("Протокол") Или ТипЗнч(Результат.Протокол) <> Тип("Массив") Тогда
Результат.Вставить("Протокол", Новый Массив);
КонецЕсли;
Результат.Протокол.Добавить(Формат(ТекущаяДатаСеанса(), "ДЛФ=T") + " " + Текст);
КонецПроцедуры
Функция ЗначениеДляCSV(Значение)
Если Значение = Неопределено Или Значение = Null Тогда
Возврат "";
КонецЕсли;
Если ТипЗнч(Значение) = Тип("Булево") Тогда
Возврат ?(Значение, "1", "0");
КонецЕсли;
Если ТипЗнч(Значение) = Тип("Число") Тогда
Возврат Формат(Значение, "ЧН=0; ЧГ=0; ЧР=.");
КонецЕсли;
Если ТипЗнч(Значение) = Тип("Дата") Тогда
Если Не ЗначениеЗаполнено(Значение) Тогда
Возврат "";
КонецЕсли;
Возврат Формат(Значение, "ДФ=yyyy-MM-ddTHH:mm:ss");
КонецЕсли;
Если ТипЗнч(Значение) = Тип("УникальныйИдентификатор") Тогда
Возврат Строка(Значение);
КонецЕсли;
Текст = СокрЛП(Строка(Значение));
Текст = СтрЗаменить(Текст, """", """""");
Если СтрНайти(Текст, ";") > 0 Или СтрНайти(Текст, Символы.ПС) > 0 Или СтрНайти(Текст, """") > 0 Тогда
Текст = """" + Текст + """";
КонецЕсли;
Возврат Текст;
КонецФункции
Процедура ДобавитьВСозданныеДокументы(ДокументСсылка, ВидОстатков, Склад, Соглашение, Партнер, СтрокиТоваров, Комментарий, ЭтоТест) Процедура ДобавитьВСозданныеДокументы(ДокументСсылка, ВидОстатков, Склад, Соглашение, Партнер, СтрокиТоваров, Комментарий, ЭтоТест)
НовСтр = СозданныеДокументы.Добавить(); НовСтр = СозданныеДокументы.Добавить();
@@ -31,6 +31,11 @@
<CommandName>Form.Command.СоздатьДокументы</CommandName> <CommandName>Form.Command.СоздатьДокументы</CommandName>
<ExtendedTooltip name="ФормаСоздатьДокументыРасширеннаяПодсказка" id="124"/> <ExtendedTooltip name="ФормаСоздатьДокументыРасширеннаяПодсказка" id="124"/>
</Button> </Button>
<Button name="ФормаВыгрузитьТаблицыВCSV" id="1570">
<Type>CommandBarButton</Type>
<CommandName>Form.Command.ВыгрузитьТаблицыВCSV</CommandName>
<ExtendedTooltip name="ФормаВыгрузитьТаблицыВCSVРасширеннаяПодсказка" id="1571"/>
</Button>
<Button name="ФормаВосстановитьЗначения" id="1514"> <Button name="ФормаВосстановитьЗначения" id="1514">
<Type>CommandBarButton</Type> <Type>CommandBarButton</Type>
<CommandName>Form.StandardCommand.RestoreValues</CommandName> <CommandName>Form.StandardCommand.RestoreValues</CommandName>
@@ -95,6 +100,82 @@
<ContextMenu name="СоздаватьЗаглушкиСерийКонтекстноеМеню" id="178"/> <ContextMenu name="СоздаватьЗаглушкиСерийКонтекстноеМеню" id="178"/>
<ExtendedTooltip name="СоздаватьЗаглушкиСерийРасширеннаяПодсказка" id="179"/> <ExtendedTooltip name="СоздаватьЗаглушкиСерийРасширеннаяПодсказка" id="179"/>
</CheckBoxField> </CheckBoxField>
<InputField name="РежимЗаписиФайловВыгрузки" id="1578">
<DataPath>Объект.РежимЗаписиФайловВыгрузки</DataPath>
<ToolTip>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Куда писать CSV и логи: на клиент пользователя или на сервер 1С (путь должен быть доступен выбранной стороне)</v8:content>
</v8:item>
</ToolTip>
<ToolTipRepresentation>ShowRight</ToolTipRepresentation>
<DropListButton>true</DropListButton>
<ChoiceButton>false</ChoiceButton>
<ClearButton>false</ClearButton>
<ListChoiceMode>true</ListChoiceMode>
<TextEdit>false</TextEdit>
<ChoiceList>
<xr:Item>
<xr:Presentation/>
<xr:CheckState>0</xr:CheckState>
<xr:Value xsi:type="FormChoiceListDesTimeValue">
<Presentation>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Клиент</v8:content>
</v8:item>
</Presentation>
<Value xsi:type="xs:string">Клиент</Value>
</xr:Value>
</xr:Item>
<xr:Item>
<xr:Presentation/>
<xr:CheckState>0</xr:CheckState>
<xr:Value xsi:type="FormChoiceListDesTimeValue">
<Presentation>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Сервер</v8:content>
</v8:item>
</Presentation>
<Value xsi:type="xs:string">Сервер</Value>
</xr:Value>
</xr:Item>
</ChoiceList>
<ContextMenu name="РежимЗаписиФайловВыгрузкиКонтекстноеМеню" id="1579"/>
<ExtendedTooltip name="РежимЗаписиФайловВыгрузкиРасширеннаяПодсказка" id="1580"/>
</InputField>
<InputField name="ПутьКФайламВыгрузкиТаблиц" id="1572">
<DataPath>Объект.ПутьКФайламВыгрузкиТаблиц</DataPath>
<ToolTip>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Каталог для CSV таблиц (own/comm) и файловых логов. В режиме «Клиент» — путь на ПК пользователя; в режиме «Сервер» — путь/UNC, доступный серверу 1С</v8:content>
</v8:item>
</ToolTip>
<ToolTipRepresentation>ShowRight</ToolTipRepresentation>
<ChoiceButton>true</ChoiceButton>
<ClearButton>true</ClearButton>
<OpenButton>false</OpenButton>
<ContextMenu name="ПутьКФайламВыгрузкиТаблицКонтекстноеМеню" id="1573"/>
<ExtendedTooltip name="ПутьКФайламВыгрузкиТаблицРасширеннаяПодсказка" id="1574"/>
<Events>
<Event name="StartChoice">ПутьКФайламВыгрузкиТаблицНачалоВыбора</Event>
</Events>
</InputField>
<CheckBoxField name="ПисатьЛогиВПапку" id="1575">
<DataPath>ПисатьЛогиВПапку</DataPath>
<ToolTip>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Писать подробный лог «Создать документы» в каталог выгрузки (не сохраняется между сеансами)</v8:content>
</v8:item>
</ToolTip>
<ToolTipRepresentation>ShowRight</ToolTipRepresentation>
<CheckBoxType>Auto</CheckBoxType>
<ContextMenu name="ПисатьЛогиВПапкуКонтекстноеМеню" id="1576"/>
<ExtendedTooltip name="ПисатьЛогиВПапкуРасширеннаяПодсказка" id="1577"/>
</CheckBoxField>
<Pages name="ГруппаСтраницы" id="1"> <Pages name="ГруппаСтраницы" id="1">
<Title> <Title>
<v8:item> <v8:item>
@@ -1251,6 +1332,8 @@
<Field>Объект.ДатаОстатков</Field> <Field>Объект.ДатаОстатков</Field>
<Field>Объект.Организация</Field> <Field>Объект.Организация</Field>
<Field>Объект.ПодключениеКСтороннейБазе</Field> <Field>Объект.ПодключениеКСтороннейБазе</Field>
<Field>Объект.ПутьКФайламВыгрузкиТаблиц</Field>
<Field>Объект.РежимЗаписиФайловВыгрузки</Field>
</Save> </Save>
<Columns> <Columns>
<AdditionalColumns table="Объект.ВходящиеСобственныеТовары"/> <AdditionalColumns table="Объект.ВходящиеСобственныеТовары"/>
@@ -1329,6 +1412,17 @@
<v8:Type>cfg:CatalogRef.РК_НастройкиПодключенияКВнешнейБазе</v8:Type> <v8:Type>cfg:CatalogRef.РК_НастройкиПодключенияКВнешнейБазе</v8:Type>
</Type> </Type>
</Attribute> </Attribute>
<Attribute name="ПисатьЛогиВПапку" id="6">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Писать логи в папку</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:boolean</v8:Type>
</Type>
</Attribute>
</Attributes> </Attributes>
<Commands> <Commands>
<Command name="ЗагрузитьОстатки" id="2"> <Command name="ЗагрузитьОстатки" id="2">
@@ -1403,6 +1497,25 @@
</Picture> </Picture>
<Action>СоздатьДокументы</Action> <Action>СоздатьДокументы</Action>
</Command> </Command>
<Command name="ВыгрузитьТаблицыВCSV" id="13">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Выгрузить таблицы в CSV</v8:content>
</v8:item>
</Title>
<ToolTip>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Выгрузить собственные и комиссионные товары в CSV в каталог выгрузки</v8:content>
</v8:item>
</ToolTip>
<Picture>
<xr:Ref>StdPicture.Write</xr:Ref>
<xr:LoadTransparent>true</xr:LoadTransparent>
</Picture>
<Action>ВыгрузитьТаблицыВCSV</Action>
</Command>
<Command name="СкладыОтборОтметить" id="5"> <Command name="СкладыОтборОтметить" id="5">
<Title> <Title>
<v8:item> <v8:item>
@@ -21,6 +21,10 @@
Объект.ДатаДокументовВвода = Объект.ДатаОстатков; Объект.ДатаДокументовВвода = Объект.ДатаОстатков;
КонецЕсли; КонецЕсли;
Если ПустаяСтрока(Объект.РежимЗаписиФайловВыгрузки) Тогда
Объект.РежимЗаписиФайловВыгрузки = "Клиент";
КонецЕсли;
ПостроитьДеревоГруппИзТабличнойЧасти(); ПостроитьДеревоГруппИзТабличнойЧасти();
КонецПроцедуры КонецПроцедуры
@@ -30,6 +34,9 @@
СинхронизироватьТабличнуюЧастьГруппИзДерева(); СинхронизироватьТабличнуюЧастьГруппИзДерева();
ПодключениеКСтороннейБазеПредыдущее = Объект.ПодключениеКСтороннейБазе; ПодключениеКСтороннейБазеПредыдущее = Объект.ПодключениеКСтороннейБазе;
Если ПустаяСтрока(Объект.РежимЗаписиФайловВыгрузки) Тогда
Объект.РежимЗаписиФайловВыгрузки = "Клиент";
КонецЕсли;
КонецПроцедуры КонецПроцедуры
@@ -231,13 +238,71 @@
КонецЕсли; КонецЕсли;
РежимТест = (РезультатВопроса <> КодВозвратаДиалога.Да); РежимТест = (РезультатВопроса <> КодВозвратаДиалога.Да);
Попытка Попытка
Текст = СоздатьДокументыНаСервере(РежимТест); РезультатВызова = СоздатьДокументыНаСервере(РежимТест);
Текст = РезультатВызова.Текст;
ТекстЛога = РезультатВызова.ТекстЛога;
Исключение Исключение
ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат; Возврат;
КонецПопытки; КонецПопытки;
Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаСозданныеДокументы; Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаСозданныеДокументы;
ПоказатьОповещениеПользователя("Документы ввода", , Текст); ПоказатьОповещениеПользователя("Документы ввода", , Текст);
Если ПисатьЛогиВПапку Тогда
ЗаписатьЛогПрогона(ТекстЛога, "create_docs");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьТаблицыВCSV(Команда)
Каталог = СокрЛП(Объект.ПутьКФайламВыгрузкиТаблиц);
Если ПустаяСтрока(Каталог) Тогда
ПоказатьПредупреждение(, "Укажите путь к файлам выгрузки таблиц");
Возврат;
КонецЕсли;
Попытка
Если ЗаписьФайловНаСервере() Тогда
РезультатЗаписи = ВыгрузитьИЗаписатьТаблицыCSVНаСервере();
ИмяOwn = РезультатЗаписи.Own;
ИмяComm = РезультатЗаписи.Comm;
Иначе
Данные = ВыгрузитьТаблицыВCSVНаСервере();
ИмяOwn = УникальноеИмяФайлаВКаталоге(Каталог, "crm-dev_to_crm3-26_own", "csv");
ИмяComm = УникальноеИмяФайлаВКаталоге(Каталог, "crm-dev_to_crm3-26_comm", "csv");
ЗаписатьТекстUTF8BOM(ИмяOwn, Данные.Own);
ЗаписатьТекстUTF8BOM(ИмяComm, Данные.Comm);
КонецЕсли;
Исключение
ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;
ПоказатьОповещениеПользователя("Выгрузка CSV (" + РежимЗаписиФайловДляСообщения() + ")", ,
"Own: " + ИмяOwn + Символы.ПС + "Comm: " + ИмяComm);
КонецПроцедуры
&НаКлиенте
Процедура ПутьКФайламВыгрузкиТаблицНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ЗаписьФайловНаСервере() Тогда
ПоказатьПредупреждение(,
"В режиме «Сервер» укажите путь каталога, доступный серверу 1С (локальный путь сервера или UNC-шара)."
+ Символы.ПС + "Диалог выбора открывает каталог клиента и для серверной записи не подходит.");
Возврат;
КонецЕсли;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Диалог.Заголовок = "Каталог выгрузки таблиц и логов (клиент)";
Если Не ПустаяСтрока(Объект.ПутьКФайламВыгрузкиТаблиц) Тогда
Диалог.Каталог = Объект.ПутьКФайламВыгрузкиТаблиц;
КонецЕсли;
Если Диалог.Выбрать() Тогда
Объект.ПутьКФайламВыгрузкиТаблиц = Диалог.Каталог;
КонецЕсли;
КонецПроцедуры КонецПроцедуры
@@ -245,6 +310,100 @@
#Область СлужебныеПроцедурыИФункции #Область СлужебныеПроцедурыИФункции
&НаКлиенте
Функция ЗаписьФайловНаСервере()
Возврат ВРег(СокрЛП(Объект.РежимЗаписиФайловВыгрузки)) = ВРег("Сервер");
КонецФункции
&НаКлиенте
Функция РежимЗаписиФайловДляСообщения()
Если ЗаписьФайловНаСервере() Тогда
Возврат "сервер";
КонецЕсли;
Возврат "клиент";
КонецФункции
&НаКлиенте
Процедура ЗаписатьЛогПрогона(ТекстЛога, СуффиксОперации)
Каталог = СокрЛП(Объект.ПутьКФайламВыгрузкиТаблиц);
Если ПустаяСтрока(Каталог) Тогда
ПоказатьПредупреждение(, "Включён «Писать логи в папку», но путь к каталогу не задан");
Возврат;
КонецЕсли;
Если ПустаяСтрока(ТекстЛога) Тогда
Возврат;
КонецЕсли;
Попытка
Если ЗаписьФайловНаСервере() Тогда
ИмяФайла = ЗаписатьЛогПрогонаНаСервере(ТекстЛога, СуффиксОперации);
Иначе
ИмяФайла = УникальноеИмяФайлаВКаталоге(Каталог, "rk_load_balances_" + СуффиксОперации, "log");
ЗаписатьТекстUTF8BOM(ИмяФайла, ТекстЛога);
КонецЕсли;
ПоказатьОповещениеПользователя("Лог записан (" + РежимЗаписиФайловДляСообщения() + ")", , ИмяФайла);
Исключение
ПоказатьПредупреждение(, "Не удалось записать лог: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Функция УникальноеИмяФайлаВКаталоге(Каталог, Префикс, Расширение)
Метка = Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd_HHmmss");
Разделитель = ПолучитьРазделительПути();
Кат = НормализоватьКаталогКлиент(Каталог, Разделитель);
Базовое = Кат + Префикс + "_" + Метка + "." + Расширение;
Если Не ФайлСуществуетКлиент(Базовое) Тогда
Возврат Базовое;
КонецЕсли;
Для Индекс = 2 По 99 Цикл
Кандидат = Кат + Префикс + "_" + Метка + "_" + Формат(Индекс, "ЧЦ=2; ЧВН=") + "." + Расширение;
Если Не ФайлСуществуетКлиент(Кандидат) Тогда
Возврат Кандидат;
КонецЕсли;
КонецЦикла;
Возврат Кат + Префикс + "_" + Метка + "_" + Строка(Новый УникальныйИдентификатор) + "." + Расширение;
КонецФункции
&НаКлиенте
Функция НормализоватьКаталогКлиент(Каталог, Разделитель)
Кат = Каталог;
Если Не СтрЗаканчиваетсяНа(Кат, Разделитель) И Не СтрЗаканчиваетсяНа(Кат, "/") И Не СтрЗаканчиваетсяНа(Кат, "\") Тогда
Кат = Кат + Разделитель;
КонецЕсли;
Возврат Кат;
КонецФункции
&НаКлиенте
Функция ФайлСуществуетКлиент(ПолноеИмя)
Файл = Новый Файл(ПолноеИмя);
Возврат Файл.Существует();
КонецФункции
&НаКлиенте
Процедура ЗаписатьТекстUTF8BOM(ПолноеИмя, Текст)
Запись = Новый ЗаписьТекста(ПолноеИмя, КодировкаТекста.UTF8, , Ложь);
Запись.Записать(Текст);
Запись.Закрыть();
КонецПроцедуры
&НаКлиенте &НаКлиенте
Процедура УстановитьОтметкуВыделенныхСтрок(ИмяТаблицы, Отметка) Процедура УстановитьОтметкуВыделенныхСтрок(ИмяТаблицы, Отметка)
@@ -516,7 +675,7 @@
Результат = ОбъектОбработки.СоздатьДокументыВводаОстатков(РежимТест); Результат = ОбъектОбработки.СоздатьДокументыВводаОстатков(РежимТест);
ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект"); ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");
Возврат СтрШаблон( Текст = СтрШаблон(
"Собственные док.: %1 (%2 стр.); комиссия 2.5: %3 (%4 стр.); удалено: %5; ошибок: %6; тег: %7%8", "Собственные док.: %1 (%2 стр.); комиссия 2.5: %3 (%4 стр.); удалено: %5; ошибок: %6; тег: %7%8",
Формат(Результат.СозданоДокументов, "ЧН=0; ЧГ=0"), Формат(Результат.СозданоДокументов, "ЧН=0; ЧГ=0"),
Формат(Результат.СтрокВДокументах, "ЧН=0; ЧГ=0"), Формат(Результат.СтрокВДокументах, "ЧН=0; ЧГ=0"),
@@ -527,8 +686,122 @@
Результат.ТекстТега, Результат.ТекстТега,
?(РежимТест, " (тест)", "")); ?(РежимТест, " (тест)", ""));
ТекстЛога = "";
Если ТипЗнч(Результат.Протокол) = Тип("Массив") Тогда
ТекстЛога = СтрСоединить(Результат.Протокол, Символы.ПС);
КонецЕсли;
Возврат Новый Структура("Текст, ТекстЛога", Текст, ТекстЛога);
КонецФункции КонецФункции
&НаСервере
Функция ВыгрузитьТаблицыВCSVНаСервере()
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
Результат = Новый Структура;
Результат.Вставить("Own", ОбъектОбработки.ТекстCSVТабличнойЧасти("ВходящиеСобственныеТовары"));
Результат.Вставить("Comm", ОбъектОбработки.ТекстCSVТабличнойЧасти("ВходящиеКомиссионныеТовары"));
Возврат Результат;
КонецФункции
&НаСервере
Функция ВыгрузитьИЗаписатьТаблицыCSVНаСервере()
Каталог = СокрЛП(Объект.ПутьКФайламВыгрузкиТаблиц);
Если ПустаяСтрока(Каталог) Тогда
ВызватьИсключение "Укажите путь к файлам выгрузки таблиц";
КонецЕсли;
ПроверитьКаталогВыгрузкиНаСервере(Каталог);
Данные = ВыгрузитьТаблицыВCSVНаСервере();
ИмяOwn = УникальноеИмяФайлаВКаталогеНаСервере(Каталог, "crm-dev_to_crm3-26_own", "csv");
ИмяComm = УникальноеИмяФайлаВКаталогеНаСервере(Каталог, "crm-dev_to_crm3-26_comm", "csv");
ЗаписатьТекстUTF8BOMНаСервере(ИмяOwn, Данные.Own);
ЗаписатьТекстUTF8BOMНаСервере(ИмяComm, Данные.Comm);
Возврат Новый Структура("Own, Comm", ИмяOwn, ИмяComm);
КонецФункции
&НаСервере
Функция ЗаписатьЛогПрогонаНаСервере(ТекстЛога, СуффиксОперации)
Каталог = СокрЛП(Объект.ПутьКФайламВыгрузкиТаблиц);
Если ПустаяСтрока(Каталог) Тогда
ВызватьИсключение "Путь к каталогу выгрузки не задан";
КонецЕсли;
ПроверитьКаталогВыгрузкиНаСервере(Каталог);
ИмяФайла = УникальноеИмяФайлаВКаталогеНаСервере(Каталог, "rk_load_balances_" + СуффиксОперации, "log");
ЗаписатьТекстUTF8BOMНаСервере(ИмяФайла, ТекстЛога);
Возврат ИмяФайла;
КонецФункции
&НаСервере
Процедура ПроверитьКаталогВыгрузкиНаСервере(Каталог)
КаталогФайл = Новый Файл(Каталог);
Если Не КаталогФайл.Существует() Тогда
ВызватьИсключение "Каталог на сервере не найден или недоступен: " + Каталог;
КонецЕсли;
Если Не КаталогФайл.ЭтоКаталог() Тогда
ВызватьИсключение "Указанный путь на сервере не является каталогом: " + Каталог;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция УникальноеИмяФайлаВКаталогеНаСервере(Каталог, Префикс, Расширение)
Метка = Формат(ТекущаяДатаСеанса(), "ДФ=yyyy-MM-dd_HHmmss");
Разделитель = ПолучитьРазделительПути();
Кат = Каталог;
Если Не СтрЗаканчиваетсяНа(Кат, Разделитель) И Не СтрЗаканчиваетсяНа(Кат, "/") И Не СтрЗаканчиваетсяНа(Кат, "\") Тогда
Кат = Кат + Разделитель;
КонецЕсли;
Базовое = Кат + Префикс + "_" + Метка + "." + Расширение;
Если Не ФайлСуществуетНаСервере(Базовое) Тогда
Возврат Базовое;
КонецЕсли;
Для Индекс = 2 По 99 Цикл
Кандидат = Кат + Префикс + "_" + Метка + "_" + Формат(Индекс, "ЧЦ=2; ЧВН=") + "." + Расширение;
Если Не ФайлСуществуетНаСервере(Кандидат) Тогда
Возврат Кандидат;
КонецЕсли;
КонецЦикла;
Возврат Кат + Префикс + "_" + Метка + "_" + Строка(Новый УникальныйИдентификатор) + "." + Расширение;
КонецФункции
&НаСервере
Функция ФайлСуществуетНаСервере(ПолноеИмя)
Файл = Новый Файл(ПолноеИмя);
Возврат Файл.Существует();
КонецФункции
&НаСервере
Процедура ЗаписатьТекстUTF8BOMНаСервере(ПолноеИмя, Текст)
Попытка
Запись = Новый ЗаписьТекста(ПолноеИмя, КодировкаТекста.UTF8, , Ложь);
Запись.Записать(Текст);
Запись.Закрыть();
Исключение
ВызватьИсключение "Ошибка записи файла на сервере (" + ПолноеИмя + "): "
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
КонецПроцедуры
&НаСервере &НаСервере
Функция ЗначениеСвойстваОтвета(Источник, Имя) Функция ЗначениеСвойстваОтвета(Источник, Имя)