В работе часто приходится сжимать выгруженные данные в zip архив, отправлять по почте, и потом автоматически разархивировать полученный zip файл:
// Распаковывает файл архива ZIP в указанный каталог; Извлекает все файлы архива // // Параметры: // ПолноеИмяФайлаАрхива - Строка - имя файла архива, который необходимо распаковать // ПутьРаспаковкиФайлов - Строка - путь по которому необходимо распаковать файлы // ПарольАрхива - Строка - пароль для распаковки архива. По умолчанию пустая строка // // Возвращаемое значение: // Результат - Булево - Истина, если успешно, Ложь, если нет. // Функция РаспаковатьZipФайл(Знач ПолноеИмяФайлаАрхива, Знач ПутьРаспаковкиФайлов, Знач ПарольАрхива = "") Экспорт // возвращаемое значение функции Результат = Истина; Попытка Архиватор = Новый ЧтениеZipФайла(ПолноеИмяФайлаАрхива, ПарольАрхива); Исключение Архиватор = Неопределено; СообщитьОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Ложь; КонецПопытки; Попытка Архиватор.ИзвлечьВсе(ПутьРаспаковкиФайлов, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); Исключение СтрокаСообщения = НСтр("ru = 'Ошибка при распаковке файлов архива: %1 в каталог: %2'"); СтрокаСообщения = ПодставитьПараметрыВСтроку(СтрокаСообщения, ПолноеИмяФайлаАрхива, ПутьРаспаковкиФайлов); Сообщить(СтрокаСообщения); Результат = Ложь; КонецПопытки; Архиватор.Закрыть(); Архиватор = Неопределено; Возврат Результат; КонецФункции // Запаковывает указанный каталог в файл архива ZIP // // Параметры: // ПолноеИмяФайлаАрхива - Строка - имя файла архива, в который необходимо запаковать // МаскаУпаковкиФайлов - Строка - имя файла, помещаемого в архив, или маска. // Недопустимо использование в именах файлов и папок букв национальных алфавитов, которые при // преобразовании из символов UNICODE в узкие символы могут быть преобразованы с потерей информации. // Рекомендуется использовать в именах файлов и папок символы латинского алфавита. // ПарольАрхива - Строка - пароль для архива. По умолчанию пустая строка // // Возвращаемое значение: // Результат - Булево - Истина, если успешно, Ложь, если нет. // Функция ЗапаковатьВZipФайл(Знач ПолноеИмяФайлаАрхива, Знач МаскаУпаковкиФайлов, Знач ПарольАрхива = "") Экспорт // возвращаемое значение функции Результат = Истина; Попытка Архиватор = Новый ЗаписьZipФайла(ПолноеИмяФайлаАрхива, ПарольАрхива); Исключение Архиватор = Неопределено; СообщитьОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Ложь; КонецПопытки; Попытка Архиватор.Добавить(МаскаУпаковкиФайлов, РежимСохраненияПутейZIP.НеСохранятьПути); Архиватор.Записать(); Исключение СтрокаСообщения = НСтр("ru = 'Ошибка при запаковке файлов архива: %1 из каталог: %2'"); СтрокаСообщения = ПодставитьПараметрыВСтроку(СтрокаСообщения, ПолноеИмяФайлаАрхива, МаскаУпаковкиФайлов); Сообщить(СтрокаСообщения); Результат = Ложь; КонецПопытки; Архиватор = Неопределено; Возврат Результат; КонецФункции
В примере используется строковая функция ПодставитьПараметрыВСтроку():
// Подставляет параметры в строку. Максимально возможное число параметров - 9. // Параметры в строке задаются как %<номер параметра>. Нумерация параметров начинается с единицы. // // Параметры: // СтрокаПодстановки – Строка – шаблон строки с параметрами (вхождениями вида "%ИмяПараметра"); // Параметр<n> - Строка - подставляемый параметр. // // Возвращаемое значение: // Строка – текстовая строка с подставленными параметрами. // // Пример: // ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел в Зоопарк". // Функция ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки, Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт Если СтрокаПодстановки = Неопределено ИЛИ СтрДлина(СтрокаПодстановки) = 0 Тогда Возврат ""; КонецЕсли; Результат = ""; НачПозиция = 1; Позиция = 1; Пока Позиция <= СтрДлина(СтрокаПодстановки) Цикл СимволСтроки = Сред(СтрокаПодстановки, Позиция, 1); Если СимволСтроки <> "%" Тогда Позиция = Позиция + 1; Продолжить; КонецЕсли; Результат = Результат + Сред(СтрокаПодстановки, НачПозиция, Позиция - НачПозиция); Позиция = Позиция + 1; СимволСтроки = Сред(СтрокаПодстановки, Позиция, 1); Если СимволСтроки = "%" Тогда Позиция = Позиция + 1; НачПозиция = Позиция; Результат = Результат + "%"; Продолжить; КонецЕсли; Попытка НомерПараметра = Число(СимволСтроки); Исключение ВызватьИсключение НСтр("ru='Входная строка СтрокаПодстановки имеет неверный формат: %'" + СимволСтроки); КонецПопытки; Если СимволСтроки = "1" Тогда ЗначениеПараметра = Параметр1; ИначеЕсли СимволСтроки = "2" Тогда ЗначениеПараметра = Параметр2; ИначеЕсли СимволСтроки = "3" Тогда ЗначениеПараметра = Параметр3; ИначеЕсли СимволСтроки = "4" Тогда ЗначениеПараметра = Параметр4; ИначеЕсли СимволСтроки = "5" Тогда ЗначениеПараметра = Параметр5; ИначеЕсли СимволСтроки = "6" Тогда ЗначениеПараметра = Параметр6; ИначеЕсли СимволСтроки = "7" Тогда ЗначениеПараметра = Параметр7; ИначеЕсли СимволСтроки = "8" Тогда ЗначениеПараметра = Параметр8; ИначеЕсли СимволСтроки = "9" Тогда ЗначениеПараметра = Параметр9; Иначе ВызватьИсключение НСтр("ru='Входная строка СтрокаПодстановки имеет неверный формат: %'" + ЗначениеПараметра); КонецЕсли; Если ЗначениеПараметра = Неопределено Тогда ЗначениеПараметра = ""; Иначе ЗначениеПараметра = Строка(ЗначениеПараметра); КонецЕсли; Результат = Результат + ЗначениеПараметра; Позиция = Позиция + 1; НачПозиция = Позиция; КонецЦикла; Если (НачПозиция <= СтрДлина(СтрокаПодстановки)) Тогда Результат = Результат + Сред(СтрокаПодстановки, НачПозиция, СтрДлина(СтрокаПодстановки) - НачПозиция + 1); КонецЕсли; Возврат Результат; КонецФункции
Функция ПроверкаНаДублиСтрок(Ссылка, ИмяТаблЧасти = "Товары", Колонка = "Товар", Колонка2 = "", Отказ = Ложь, Заголовок = "") Экспорт ИмяДока = Ссылка.Метаданные().Имя; ЕстьДополнительно = Колонка2 <> ""; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Док." + Колонка + " КАК ID, | ПРЕДСТАВЛЕНИЕ(Док." + Колонка + ") КАК Сверка," + ?(ЕстьДополнительно," | ПРЕДСТАВЛЕНИЕ(Док." + Колонка2 + ") КАК Сверка2,", "") + " | Док.НомерСтроки КАК НомерСтроки, | ДокКопия.НомерСтроки КАК НомерСтрокиКопия |ИЗ | Документ." + ИмяДока + "." + ИмяТаблЧасти + " КАК Док | СОЕДИНЕНИЕ Документ." + ИмяДока + "." + ИмяТаблЧасти + " КАК ДокКопия | ПО Док." + Колонка + "= ДокКопия." + Колонка + " | И Док.НомерСтроки < ДокКопия.НомерСтроки" + ?(ЕстьДополнительно," | И Док." + Колонка2 + "= ДокКопия." + Колонка2, "") + " |ГДЕ | Док.Ссылка = &Ссылка | И ДокКопия.Ссылка = &Ссылка | |УПОРЯДОЧИТЬ ПО | ID, | НомерСтроки"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить().Выбрать(); ЕстьДубль = Ложь; СтрокаСообщения = "Проверка табличной части на дублирующиеся строки: |Обнаружены одинаковые позиции! Колонк" + ?(ЕстьДополнительно, "и: " +Колонка +" и " + Колонка2, "а: "+ Колонка); Пока Результат.Следующий() Цикл Если ЕстьДополнительно Тогда Значение = СокрП(Результат.Сверка)+ ", " + Результат.Сверка2; Иначе Значение = Результат.Сверка; КонецЕсли; СтрокаСообщения = СтрокаСообщения + Символы.ПС + "Строка № " + Формат(Результат.НомерСтроки, "ЧГ=") + " и строка № " + Формат(Результат.НомерСтрокиКопия, "ЧГ=") + " значение: " + Значение; ЕстьДубль = Истина; КонецЦикла; Если ЕстьДубль Тогда обСообщитьОбОшибке(СтрокаСообщения, Отказ, Заголовок); КонецЕсли; Возврат Отказ; КонецФункции
МассивКолонок = Новый Массив; МассивКолонок.Добавить("Количество"); СсылочныеКолонки = Новый Соответствие; СсылочныеКолонки["Адрес"] = Справочники.АдресаЯчеек.ПустаяСсылка(); СсылочныеКолонки["Товар"] = Справочники.Номенклатура.ПустаяСсылка(); ПроверкаЗаполненияТабличнойЧасти(Ссылка, "Товары", МассивКолонок, СсылочныеКолонки, Отказ); //выбирает не заполненные строки //СсылкаНаОбъект - ссылка на проверяемый документ, ИмяТабЧасти - имя проверяемой табличной части, //СписокКолонок - массив с именами колонок //СсылочныеКолонки - соответсвие имен колонок и пустых ссылок типов этих колонок Процедура ПроверкаЗаполненияТабличнойЧасти(СсылкаНаОбъект, ИмяТабЧасти = "Товары", СписокКолонок, СсылочныеКолонки = Неопределено, Отказ = Ложь, Заголовок = "") Экспорт ИмяДока = СсылкаНаОбъект.Метаданные().Имя; Запрос = Новый Запрос; Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект); ТекстЗапроса = "ВЫБРАТЬ | Док.НомерСтроки |ИЗ | Документ." + ИмяДока + "." + ИмяТабЧасти + " КАК Док |ГДЕ | Док.Ссылка = &Ссылка И ("; СтрокаКолонок = ""; Если СсылочныеКолонки <> Неопределено Тогда Для каждого Колонка Из СсылочныеКолонки Цикл ТекстЗапроса = ТекстЗапроса + " Док." + Колонка.Ключ + " = &" + Колонка.Ключ + " ИЛИ"; СтрокаКолонок = СтрокаКолонок + Колонка.Ключ + ", "; Запрос.УстановитьПараметр(Колонка.Ключ, Колонка.Значение); КонецЦикла; КонецЕсли; Для каждого Колонка Из СписокКолонок Цикл ТекстЗапроса = ТекстЗапроса + " Док." + Колонка + " = 0 ИЛИ"; СтрокаКолонок = СтрокаКолонок + Колонка + ", "; КонецЦикла; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, Колонка + " = 0 ИЛИ", Колонка + " = 0)"); Запрос.Текст = ТекстЗапроса; СтрокаСообщения = "Проверка табличной части на заполнение по колонкам: " + СтрокаКолонок; Результат = Запрос.Выполнить().Выбрать(); ЕстьОшибки = Ложь; Пока Результат.Следующий() Цикл СтрокаСообщения = СтрокаСообщения + Символы.ПС + "В строке № " + Формат(Результат.НомерСтроки, "ЧГ=0") + " есть не заполненное значение!"; ЕстьОшибки = Истина; КонецЦикла; Если ЕстьОшибки Тогда СообщитьОбОшибке(СтрокаСообщения, Отказ, Заголовок); КонецЕсли; КонецПроцедуры