Файл ВыгрузкаСрочныхЗаявок.epf
&НаКлиенте
Процедура ВыполнитьОбработку(Команда)
// Запуск серверной процедуры с параметрами, введенными пользователем на форме.
ВыполнитьОбработкуНаСервере(ПутьКФайлуCSV, ПутьДляСохранения);
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Устанавливаем путь к CSV-файлу по умолчанию (например, рабочий стол)
ПутьКФайлуCSV = «E:\1C\ЗакупкиЗаявки\Заявки.csv»;
// Устанавливаем каталог для выгрузки файлов (например, временная папка)
ПутьДляСохранения = "E:\1C\ЗакупкиЗаявки\Выгружены";
// Если хотите предложить каталог "Мои документы":
// ПутьДляСохранения = ПолучитьОсобыйКаталог("МоиДокументы");
КонецПроцедуры
&НаСервере
//НРег(Лев(Выборка.ИмяФайла, СтрДлина(«Заявка на закупку»))) = «заявка на закупку»
Процедура ВыгрузитьФайлыДокумента(СсылкаНаДокумент, ПутьДляСохранения, РезультатСтрока)
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| Файлы.Ссылка КАК СсылкаФайла,
| Файлы.Наименование КАК ИмяФайла,
| Файлы.ТекущаяВерсияРасширение КАК РасширениеФайла
|ИЗ
| Справочник.Файлы КАК Файлы
|ГДЕ
| Файлы.ВладелецФайла = &СсылкаНаДокумент»;
Запрос.УстановитьПараметр("СсылкаНаДокумент", СсылкаНаДокумент);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ИмяБезРасширения = Выборка.ИмяФайла;
Расширение = Выборка.РасширениеФайла;
// Проверяем начало имени (без учёта регистра)
Если НЕ СтрНачинаетсяС(НРег(ИмяБезРасширения), "заявка на закупку") Тогда
Продолжить;
КонецЕсли;
// Формируем полное имя
ПолноеИмя = ИмяБезРасширения;
Если НЕ ПустаяСтрока(Расширение) Тогда
ПолноеИмя = ПолноеИмя + "." + Расширение;
КонецЕсли;
ПолныйПуть = ПутьДляСохранения + "\" + ПолноеИмя;
// Получаем двоичные данные через типовую функцию
ДвоичныеДанные = РаботаСФайламиВызовСервера.ПолучитьДвоичныеДанныеФайла(Выборка.СсылкаФайла);
Если ДвоичныеДанные <> Неопределено Тогда
Попытка
ДвоичныеДанные.Записать(ПолныйПуть);
РезультатСтрока.Результат = "Файл '" + ПолноеИмя + "' выгружен.";
Исключение
РезультатСтрока.Результат = "Ошибка записи: " + ОписаниеОшибки();
КонецПопытки;
Иначе
РезультатСтрока.Результат = "Не удалось получить данные файла.";
КонецЕсли;
Прервать; // выгружаем только первый подходящий файл
КонецЦикла;
Если Выборка.Количество() = 0 Тогда
РезультатСтрока.Результат = "Нет файлов, начинающихся с 'Заявка на закупку'.";
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьДвоичныеДанныеИзХранилища(ЗначениеХранилища)
// Пытается извлечь ДвоичныеДанные из разных возможных типов
Если ЗначениеХранилища = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
// Вариант 1: это уже ДвоичныеДанные
Если ТипЗнч(ЗначениеХранилища) = Тип("ДвоичныеДанные") Тогда
Возврат ЗначениеХранилища;
КонецЕсли;
// Вариант 2: это ХранилищеЗначения
Если ТипЗнч(ЗначениеХранилища) = Тип("ХранилищеЗначения") Тогда
Возврат ЗначениеХранилища.Получить();
КонецЕсли;
// Вариант 3: это Строка (путь к файлу в файловом хранилище) – редко, но бывает
Если ТипЗнч(ЗначениеХранилища) = Тип("Строка") Тогда
// Пытаемся прочитать файл с диска
Если НЕ ПустаяСтрока(ЗначениеХранилища) Тогда
ФайлДляПроверки = Новый Файл(ЗначениеХранилища);
Если ФайлДляПроверки.Существует() Тогда
Возврат Новый ДвоичныеДанные(ЗначениеХранилища);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Неопределено;
КонецФункции
&НаСервере
Функция НайтиДокументПоНомеруГоду(НомерДокумента, Год = 2026)
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ДокументыПредприятия.Ссылка КАК Ссылка
|ИЗ
| Справочник.ДокументыПредприятия КАК ДокументыПредприятия
|ГДЕ
| ДокументыПредприятия.РегистрационныйНомер = &Номер
| И ДокументыПредприятия.ВидДокумента.Наименование = &ВидДокумента
| И ГОД(ДокументыПредприятия.ДатаРегистрации) = &Год»;
Запрос.УстановитьПараметр("Номер", НомерДокумента);
Запрос.УстановитьПараметр("ВидДокумента", "Заявка на закупку");
Запрос.УстановитьПараметр("Год", Год);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
Иначе
Возврат Справочники.ДокументыПредприятия.ПустаяСсылка();
КонецЕсли;
КонецФункции
Процедура ВыполнитьОбработкуНаСервере(ПутьКФайлуCSV, ПутьДляСохранения)
// 1. Очистим таблицу для вывода результатов.
ТаблицаДокументов.Очистить();
// 2. Проверка: указаны ли пути к файлам.
Если ПутьКФайлуCSV = "" Или ПутьДляСохранения = "" Тогда
Сообщить("Пожалуйста, укажите путь к CSV-файлу и каталог для сохранения.");
Возврат;
КонецЕсли;
// 3. Чтение CSV-файла и получение списка номеров документов.
СписокНомеров = ЗагрузитьСписокИзCSV(ПутьКФайлуCSV);
Если СписокНомеров = Неопределено Тогда
Сообщить("Не удалось прочитать CSV-файл. Проверьте формат и путь.");
Возврат;
КонецЕсли;
// 4. Основной цикл по списку номеров.
Для каждого НомерДокумента Из СписокНомеров Цикл
НоваяСтрока = ТаблицаДокументов.Добавить();
НоваяСтрока.НомерДокумента = НомерДокумента;
НайденныйДокумент = НайтиДокументПоНомеруГоду(НомерДокумента, 2026);
Если НайденныйДокумент = Справочники.ДокументыПредприятия.ПустаяСсылка() Тогда
НоваяСтрока.Результат = "Документ не найден за 2026 год!";
Продолжить;
КонецЕсли;
// Вызываем новую процедуру выгрузки файлов
ВыгрузитьФайлыДокумента(НайденныйДокумент, ПутьДляСохранения, НоваяСтрока);
КонецЦикла;
Сообщить("Обработка завершена. Результаты показаны в таблице.");
КонецПроцедуры
&НаСервере
Функция ЗагрузитьСписокИзCSV(ПутьКФайлуCSV)
// Функция для чтения CSV-файла.
СписокНомеров = Новый Массив;
ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлуCSV, КодировкаТекста.UTF8);
Попытка
Пока Истина Цикл
СтрокаФайла = ЧтениеТекста.ПрочитатьСтроку();
Если СтрокаФайла = Неопределено Тогда
Прервать;
КонецЕсли;
// Убираем возможные кавычки и лишние пробелы.
Номер = СокрЛП(Строка(СтрокаФайла));
Если Номер <> "" Тогда
СписокНомеров.Добавить(Номер);
КонецЕсли;
КонецЦикла;
Исключение
Сообщить("Ошибка при чтении файла: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
ЧтениеТекста.Закрыть();
Возврат СписокНомеров;
КонецФункции