/
1CPilot
/
MaterialRep
Обзор
Документация
Войти
/
1CPilot
/
MaterialRep
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Module.bsl
282 строки
19 KB
1CPilot
upload files
14 июл 2025, 21:31
14 июл 2025, 21:31
63a978d
Код
Авторство
О чём код?
// Дополнительные переменные формы Перем Склад; Перем СчетУчета; Перем ПутьВыгрузки; Перем СписокНоменклатуры; &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) СписокНоменклатуры = Новый ТаблицаЗначений; СписокНоменклатуры.Колонки.Добавить("ЗагружатьСтроку", Новый ОписаниеТипов("Булево")); СписокНоменклатуры.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура")); СписокНоменклатуры.Колонки.Добавить("Услуга", Новый ОписаниеТипов("Булево")); СписокНоменклатуры.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число")); СписокНоменклатуры.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число")); СписокНоменклатуры.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число")); СписокНоменклатуры.Колонки.Добавить("СтавкаНДС"); СписокНоменклатуры.Колонки.Добавить("бит_ДеливериСтрока", Новый ОписаниеТипов("Строка")); СписокНоменклатуры.Колонки.Добавить("бит_Рейс"); СписокНоменклатуры.Колонки.Добавить("dna_ДатаКонтрагента", Новый ОписаниеТипов("Дата")); СписокНоменклатуры.Колонки.Добавить("dna_BunkeringPort"); СписокНоменклатуры.Колонки.Добавить("dna_Canals"); СписокНоменклатуры.Колонки.Добавить("dna_Drydock"); СписокНоменклатуры.Колонки.Добавить("dna_Loading_Discharging"); СписокНоменклатуры.Колонки.Добавить("НомерИнвойса", Новый ОписаниеТипов("Строка")); СписокНоменклатуры.Колонки.Добавить("dna_VesselLoading"); СписокНоменклатуры.Колонки.Добавить("dna_Контрагент"); СписокНоменклатуры.Колонки.Добавить("dna_InvoiceAmount", Новый ОписаниеТипов("Число")); СписокНоменклатуры.Колонки.Добавить("dna_InvoiceCurrency"); СписокНоменклатуры.Колонки.Добавить("dna_MonthCost", Новый ОписаниеТипов("Дата")); СписокНоменклатуры.Колонки.Добавить("dna_Agent"); КонецПроцедуры &НаКлиенте Процедура ПрочитатьДанные(Команда) ОповещениеОЗавершении = Новый ОписаниеОповещения("ПоместитьФайлНаСерверЗавершение", ЭтотОбъект); ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов("Выберите файлы отчетов", Истина, "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx"); НачатьПомещениеФайловНаСервер(ОповещениеОЗавершении, , , ПараметрыДиалога, УникальныйИдентификатор); КонецПроцедуры &НаКлиенте Процедура ПоместитьФайлНаСерверЗавершение (ПомещенныеФайлы, ДополнительныеПараметры) Экспорт Если НЕ ПомещенныеФайлы = Неопределено Тогда МассивПомещенныхФайлов = Новый Массив; Для каждого ПомещенныйФайл из ПомещенныеФайлы Цикл СтруктураПомещенныйФайл = Новый Структура; СтруктураПомещенныйФайл.Вставить("Адрес", ПомещенныйФайл.Адрес); СтруктураПомещенныйФайл.Вставить("Расширение", ПомещенныйФайл.СсылкаНаФайл.Файл.Расширение); МассивПомещенныхФайлов.Добавить(СтруктураПомещенныйФайл); КонецЦикла; ПрочитатьПомещенныеФайлыНаСервере(МассивПомещенныхФайлов); КонецЕсли; КонецПроцедуры &НаСервере Процедура ПрочитатьПомещенныеФайлыНаСервере(МассивПомещенныхФайлов) Для каждого ПомещенныйФайл Из МассивПомещенныхФайлов Цикл Расширение = ПомещенныйФайл.Расширение; Файл = ПолучитьИзВременногоХранилища(ПомещенныйФайл.Адрес); ВремФайл = ПолучитьИмяВременногоФайла(Расширение); Файл.Записать(ВремФайл); ЗагрузитьИзExcel(ВремФайл); УдалитьФайлы(ВремФайл); КонецЦикла; КонецПроцедуры // Процедура для выбора склада &НаКлиенте Процедура ВыбратьСклад(Элемент) ПараметрыВыбора = Новый Структура; ОткрытьФорму("Справочник.Склады.ФормаВыбора", ПараметрыВыбора, ЭтотОбъект, , , , Новый ОписаниеОповещения("ВыборСкладаЗавершение", ЭтотОбъект)); КонецПроцедуры &НаКлиенте Процедура ВыборСкладаЗавершение(Результат, ДополнительныеПараметры) Экспорт Если Результат <> Неопределено Тогда Склад = Результат; КонецЕсли; КонецПроцедуры // Процедура для выбора счета учета &НаКлиенте Процедура ВыбратьСчетУчета(Элемент) ПараметрыВыбора = Новый Структура; ОткрытьФорму("ПланСчетов.РабочийПланСчетов.ФормаВыбора", ПараметрыВыбора, ЭтотОбъект, , , , Новый ОписаниеОповещения("ВыборСчетаУчетаЗавершение", ЭтотОбъект)); КонецПроцедуры &НаКлиенте Процедура ВыборСчетаУчетаЗавершение(Результат, ДополнительныеПараметры) Экспорт Если Результат <> Неопределено Тогда СчетУчета = Результат; КонецЕсли; КонецПроцедуры // Процедура для выбора пути выгрузки &НаКлиенте Процедура ВыбратьПутьВыгрузки(Элемент) Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); Диалог.Заголовок = "Выберите файл для сохранения"; Диалог.ПолноеИмяФайла = ""; Диалог.Фильтр = "Excel файлы (*.xlsx)|*.xlsx"; Диалог.ТекущийКаталог = ""; Диалог.ИндексФильтра = 0; Диалог.ПроверятьСуществованиеФайла = Ложь; Диалог.Показать(Новый ОписаниеОповещения("ВыборПутиВыгрузкиЗавершение", ЭтотОбъект)); КонецПроцедуры &НаКлиенте Процедура ВыборПутиВыгрузкиЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда ПутьВыгрузки = ВыбранныеФайлы[0]; КонецЕсли; КонецПроцедуры // Процедура формирования данных для выгрузки &НаСервере Функция ПолучитьДанныеОстатков(Склад, СчетУчета) // Получаем данные ОСВ по складу и счету учета из плана счетов Данные = Новый ТаблицаЗначений; Данные.Колонки.Добавить("Номенклатура"); Данные.Колонки.Добавить("ЕдИзм"); Данные.Колонки.Добавить("ОстатокНаНачало"); Данные.Колонки.Добавить("СуммаНаНачало"); Данные.Колонки.Добавить("ПоступлениеКол"); Данные.Колонки.Добавить("ПоступлениеСумма"); // Запрос к плану счетов для получения остатков Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Остатки.Номенклатура КАК Номенклатура, | Остатки.ЕдиницаИзмерения КАК ЕдИзм, | Остатки.ОстатокНачальныйКоличество КАК ОстатокНаНачало, | Остатки.ОстатокНачальныйСумма КАК СуммаНаНачало, | Остатки.ПриходКоличество КАК ПоступлениеКол, | Остатки.ПриходСумма КАК ПоступлениеСумма |ИЗ | ПланСчетов.РабочийПланСчетов.Остатки( | &ДатаНачала, | &ДатаКонца, | , | &СчетУчета | ) КАК Остатки |ГДЕ | Остатки.СчетУчета = &СчетУчета"; Запрос.УстановитьПараметр("ДатаНачала", НачалоМесяца(ТекущаяДата())); Запрос.УстановитьПараметр("ДатаКонца", КонецМесяца(ТекущаяДата())); Запрос.УстановитьПараметр("Склад", Склад); Запрос.УстановитьПараметр("СчетУчета", СчетУчета); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл НоваяСтрока = Данные.Добавить(); НоваяСтрока.Номенклатура = Выборка.Номенклатура; НоваяСтрока.ЕдИзм = Выборка.ЕдИзм; НоваяСтрока.ОстатокНаНачало = Выборка.ОстатокНаНачало; НоваяСтрока.СуммаНаНачало = Выборка.СуммаНаНачало; НоваяСтрока.ПоступлениеКол = Выборка.ПоступлениеКол; НоваяСтрока.ПоступлениеСумма = Выборка.ПоступлениеСумма; КонецЦикла; Возврат Данные; КонецФункции // Процедура выгрузки данных в Excel &НаСервере Процедура ВыгрузитьНаСервере() Если Склад = Неопределено Или СчетУчета = Неопределено Или ПутьВыгрузки = "" Тогда Сообщить("Необходимо выбрать склад, счет учета и путь выгрузки!"); Возврат; КонецЕсли; Данные = ПолучитьДанныеОстатков(Склад, СчетУчета); // Создание Excel-файла Попытка Excel = Новый COMОбъект("Excel.Application"); Книга = Excel.Workbooks.Add(); Лист = Книга.Worksheets(1); // Заголовки Лист.Cells(1,1).Value = "Номенклатура"; Лист.Cells(1,2).Value = "Ед. изм."; Лист.Cells(1,3).Value = "Остаток на начало"; Лист.Cells(1,4).Value = "Сумма на начало"; Лист.Cells(1,5).Value = "Поступление (кол-во)"; Лист.Cells(1,6).Value = "Поступление (сумма)"; Лист.Cells(1,7).Value = "Расход (кол-во)"; Лист.Cells(1,8).Value = "Сумма расхода"; Лист.Cells(1,9).Value = "Остаток на конец"; Лист.Cells(1,10).Value = "Сумма на конец"; // Заполнение строк Строка = 2; Для Каждого Стр Из Данные Цикл Лист.Cells(Строка,1).Value = Стр.Номенклатура; Лист.Cells(Строка,2).Value = Стр.ЕдИзм; Лист.Cells(Строка,3).Value = Стр.ОстатокНаНачало; Лист.Cells(Строка,4).Value = Стр.СуммаНаНачало; Лист.Cells(Строка,5).Value = Стр.ПоступлениеКол; Лист.Cells(Строка,6).Value = Стр.ПоступлениеСумма; // Гр.7-10 заполняются на судне/автоматически Строка = Строка + 1; КонецЦикла; // Сохраняем файл Книга.SaveAs(ПутьВыгрузки); Книга.Close(); Excel.Quit(); Сообщить("Выгрузка завершена успешно!"); Исключение Сообщить("Ошибка при выгрузке в Excel: " + ОписаниеОшибки()); КонецПопытки; КонецПроцедуры // Процедура загрузки заполненного файла &НаСервере Процедура ЗагрузитьИзExcel(ПутьКФайлу) ТабличныйДокумент = Новый ТабличныйДокумент; ТабличныйДокумент.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение); ПоследняяСтрока = ТабличныйДокумент.ВысотаТаблицы; ПоследняяКолонка = ТабличныйДокумент.ШиринаТаблицы; ОбластьЯчеек = ТабличныйДокумент.Область(1, 1, ПоследняяСтрока, ПоследняяКолонка); ПостроительОтчета = Новый ПостроительОтчета; ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек); ПостроительОтчета.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять; ПостроительОтчета.ЗаполнитьНастройки(); ПостроительОтчета.Выполнить(); ТЗ = ПостроительОтчета.Результат.Выгрузить(); СписокНоменклатуры.Очистить(); ЕстьОтрицательныеСуммы = Ложь; СчОтрицСумм=0; ЗагружатьДанные = Истина; Для Каждого СтрТЗ Из ТЗ Цикл Номенклатура = Справочники.Номенклатура.ПустаяСсылка(); Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(СтрТЗ, "Item") Тогда Номенклатура = ?(ЗначениеЗаполнено(СокрЛП(СтрТЗ.Item)),Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(СтрТЗ.Item)),Справочники.Номенклатура.ПустаяСсылка()); Иначе Сообщить("Не указан Item"); КонецЕсли; Если Номенклатура<>Справочники.Номенклатура.ПустаяСсылка() Тогда СтрокаСписка = СписокНоменклатуры.Добавить(); СтрокаСписка.ЗагружатьСтроку = Истина; СтрокаСписка.Номенклатура = Номенклатура; СтрокаСписка.Услуга = Номенклатура.Услуга; КонецЦикла; ЭтаФорма.Элементы.ПредупреждениеОбОтрицательныхСуммах.Видимость = ЕстьОтрицательныеСуммы; ЭтаФорма.Элементы.КоличествоОтрицСтрок.Видимость = ЕстьОтрицательныеСуммы; Если ЕстьОтрицательныеСуммы Тогда ЭтаФорма.Элементы.ПредупреждениеОбОтрицательныхСуммах.Заголовок =НСтр("ru = 'В загружаемых данных имеются строки с отрицательной суммой!'; en = 'The data being loaded contains rows with a negative amount!'"); ЭтаФорма.Элементы.КоличествоОтрицСтрок.Заголовок = "Количество отрицательных строк: "+СчОтрицСумм; КонецЕсли; КонецПроцедуры // Процедура создания документа "Расход материалов" &НаСервере Процедура СоздатьДокументРасходМатериалов(ТаблицаПотребления) // Здесь реализовать создание документа "Расход материалов" по данным из таблицы // с учетом метода ФИФО // ... КонецПроцедуры // Процедура формирования финального варианта Продотчета на подпись &НаСервере Процедура СформироватьПродотчетНаПодпись() // Здесь реализовать формирование финального отчета на основании данных ОСВ после списания // ... КонецПроцедуры