В работе часто приходится сжимать выгруженные данные в zip архив, отправлять по почте, и потом автоматически разархивировать полученный zip файл:
Код 1C v 8.х // Распаковывает файл архива ZIP в указанный каталог; Извлекает все файлы архива
//
// Параметры:
// ПолноеИмяФайлаАрхива - Строка - имя файла архива, который необходимо распаковать
// ПутьРаспаковкиФайлов - Строка - путь по которому необходимо распаковать файлы
// ПарольАрхива - Строка - пароль для распаковки архива. По умолчанию пустая строка
//
// Возвращаемое значение:
// Результат - Булево - Истина, если успешно, Ложь, если нет.
//
Функция РаспаковатьZipФайл(Знач ПолноеИмяФайлаАрхива, Знач ПутьРаспаковкиФайлов, Знач ПарольАрхива = "") Экспорт
// возвращаемое значение функции
Результат = Истина;
Попытка
Архиватор = Новый ЧтениеZipФайла(ПолноеИмяФайлаАрхива, ПарольАрхива);
Исключение
Архиватор = Неопределено;
СообщитьОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат Ложь;
КонецПопытки;
Попытка
Архиватор.ИзвлечьВсе(ПутьРаспаковкиФайлов, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
Исключение
СтрокаСообщения = НСтр("ru = 'Ошибка при распаковке файлов архива: %1 в каталог: %2'");
СтрокаСообщения = ПодставитьПараметрыВСтроку(СтрокаСообщения, ПолноеИмяФайлаАрхива, ПутьРаспаковкиФайлов);
Сообщить(СтрокаСообщения);
Результат = Ложь;
КонецПопытки;
Архиватор.Закрыть();
Архиватор = Неопределено;
Возврат Результат;
КонецФункции
// Запаковывает указанный каталог в файл архива ZIP
//
// Параметры:
// ПолноеИмяФайлаАрхива - Строка - имя файла архива, в который необходимо запаковать
// МаскаУпаковкиФайлов - Строка - имя файла, помещаемого в архив, или маска.
// Недопустимо использование в именах файлов и папок букв национальных алфавитов, которые при
// преобразовании из символов UNICODE в узкие символы могут быть преобразованы с потерей информации.
// Рекомендуется использовать в именах файлов и папок символы латинского алфавита.
// ПарольАрхива - Строка - пароль для архива. По умолчанию пустая строка
//
// Возвращаемое значение:
// Результат - Булево - Истина, если успешно, Ложь, если нет.
//
Функция ЗапаковатьВZipФайл(Знач ПолноеИмяФайлаАрхива, Знач МаскаУпаковкиФайлов, Знач ПарольАрхива = "") Экспорт
// возвращаемое значение функции
Результат = Истина;
Попытка
Архиватор = Новый ЗаписьZipФайла(ПолноеИмяФайлаАрхива, ПарольАрхива);
Исключение
Архиватор = Неопределено;
СообщитьОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат Ложь;
КонецПопытки;
Попытка
Архиватор.Добавить(МаскаУпаковкиФайлов, РежимСохраненияПутейZIP.НеСохранятьПути);
Архиватор.Записать();
Исключение
СтрокаСообщения = НСтр("ru = 'Ошибка при запаковке файлов архива: %1 из каталог: %2'");
СтрокаСообщения = ПодставитьПараметрыВСтроку(СтрокаСообщения, ПолноеИмяФайлаАрхива, МаскаУпаковкиФайлов);
Сообщить(СтрокаСообщения);
Результат = Ложь;
КонецПопытки;
Архиватор = Неопределено;
Возврат Результат;
КонецФункции
В примере используется строковая функция ПодставитьПараметрыВСтроку ():
Код 1C v 8.х // Подставляет параметры в строку. Максимально возможное число параметров - 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);
КонецЕсли;
Возврат Результат;
КонецФункции
В данной статье описаны функции которые вы можете использовать в ЗУП для получения количества рабочих дней по графику работы сотрудника или по производственному календарю
Код 1C v 8.х // Функции получения количества рабочих дней по графику работы сотрудника ил по производственному календарю
Функция КоличествоРабочихДнейПоГрафикуРаботы(ДатаН, ДатаК, ГрафикРаботы)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ГрафикиРаботыПоВидамВремени.ГрафикРаботы,
| ГрафикиРаботыПоВидамВремени.ВидУчетаВремени,
| СУММА(ГрафикиРаботыПоВидамВремени.ОсновноеЗначение) КАК ОсновноеЗначение,
| СУММА(ГрафикиРаботыПоВидамВремени.ДополнительноеЗначение) КАК ДополнительноеЗначение,
| СУММА(ГрафикиРаботыПоВидамВремени.ОсновноеЗначениеНорма) КАК ОсновноеЗначениеНорма,
| СУММА(ГрафикиРаботыПоВидамВремени.ДополнительноеЗначениеНорма) КАК ДополнительноеЗначениеНорма
|ИЗ
| РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени
|ГДЕ
| ГрафикиРаботыПоВидамВремени.ГрафикРаботы = &ГрафикРаботы
| И ГрафикиРаботыПоВидамВремени.Дата МЕЖДУ &ДатаН И &ДатаК
| И ГрафикиРаботыПоВидамВремени.ВидУчетаВремени = &ВидУчетаВремени
|
|СГРУППИРОВАТЬ ПО
| ГрафикиРаботыПоВидамВремени.ГрафикРаботы,
| ГрафикиРаботыПоВидамВремени.ВидУчетаВремени";
Запрос.УстановитьПараметр("ГрафикРаботы", ГрафикРаботы);
Запрос.УстановитьПараметр("ДатаК", ДатаК);
Запрос.УстановитьПараметр("ДатаН", ДатаН);
Запрос.УстановитьПараметр("ВидУчетаВремени", Перечисления.ВидыУчетаВремени.ПоДням);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ОсновноеЗначение = Выборка.ОсновноеЗначение;
Иначе
ОбщегоНазначенияЗК.СообщитьОбОшибке("Проверьте заполнение графика!");
ОсновноеЗначение = 0;
КонецЕсли;
Возврат ОсновноеЗначение;
КонецФункции
Функция КоличествоРабочихДнейПоПроизвКаленд(ДатаН, ДатаК)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(РегламентированныйПроизводственныйКалендарь.КалендарныеДни) КАК КоличествоДней,
| СУММА(РегламентированныйПроизводственныйКалендарь.Пятидневка) КАК Пятидневка,
| СУММА(РегламентированныйПроизводственныйКалендарь.Шестидневка) КАК Шестидневка
|ИЗ
| РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
|ГДЕ
| РегламентированныйПроизводственныйКалендарь.ДатаКалендаря >= &ДатаН
| И РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= &ДатаК";
Запрос.УстановитьПараметр("ДатаК", ДатаК);
Запрос.УстановитьПараметр("ДатаН", ДатаН);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ОсновноеЗначение = Выборка.Пятидневка;
Иначе
ОбщегоНазначенияЗК.СообщитьОбОшибке("Проверьте заполнение графика!");
ОсновноеЗначение = 0;
КонецЕсли;
Возврат ОсновноеЗначение;
КонецФункции
Процедура сохраняет табличный документ в файл excel и открывает его
Код 1C v 8.х Процедура ОткрытьТабличныйДокументВExcel(ТабДокумент,ИмяФайла) Экспорт
ИмяФайла = Строка(ИмяФайла) + ".xls";
Каталог = КаталогВременныхФайлов();
ПолныйПутьКФайлу = Каталог + ИмяФайла;
Попытка
ТабДокумент.Записать(ПолныйПутьКФайлу,ТипФайлаТабличногоДокумента.XLS);
Сообщить("Записан новый файл " + ПолныйПутьКФайлу);
ЗапуститьПриложение(ПолныйПутьКФайлу);
Исключение
СообщитьОбОшибке(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Код 1C v 8.х Функция ПроверкаНаДублиСтрок(Ссылка, ИмяТаблЧасти = "Товары", Колонка = "Товар", Колонка2 = "", Отказ = Ложь, Заголовок = "") Экспорт
ИмяДока = Ссылка.Метаданные().Имя;
ЕстьДополнительно = Колонка2 <> "";
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Док." + Колонка + " КАК ID,
| ПРЕДСТАВЛЕНИЕ(Док." + Колонка + ") КАК Сверка," + ?(ЕстьДополнительно,"
| ПРЕДСТАВЛЕНИЕ(Док." + Колонка2 + ") КАК Сверка2,", "") + "
| Док.НомерСтроки КАК НомерСтроки,
| ДокКопия.НомерСтроки КАК НомерСтрокиКопия
|ИЗ
| Документ." + ИмяДока + "." + ИмяТаблЧасти + " КАК Док
| СОЕДИНЕНИЕ Документ." + ИмяДока + "." + ИмяТаблЧасти + " КАК ДокКопия
| ПО Док." + Колонка + "= ДокКопия." + Колонка + "
| И Док.НомерСтроки < ДокКопия.НомерСтроки" + ?(ЕстьДополнительно,"
| И Док." + Колонка2 + "= ДокКопия." + Колонка2, "") + "
|ГДЕ
| Док.Ссылка = &Ссылка
| И ДокКопия.Ссылка = &Ссылка
|
|УПОРЯДОЧИТЬ ПО
| ID,
| НомерСтроки";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить().Выбрать();
ЕстьДубль = Ложь;
СтрокаСообщения = "Проверка табличной части на дублирующиеся строки:
|Обнаружены одинаковые позиции! Колонк"
+ ?(ЕстьДополнительно, "и: " +Колонка +" и " + Колонка2, "а: "+ Колонка);
Пока Результат.Следующий() Цикл
Если ЕстьДополнительно Тогда
Значение = СокрП(Результат.Сверка)+ ", " + Результат.Сверка2;
Иначе
Значение = Результат.Сверка;
КонецЕсли;
СтрокаСообщения = СтрокаСообщения + Символы.ПС + "Строка № " + Формат(Результат.НомерСтроки, "ЧГ=")
+ " и строка № " + Формат(Результат.НомерСтрокиКопия, "ЧГ=")
+ " значение: " + Значение;
ЕстьДубль = Истина;
КонецЦикла;
Если ЕстьДубль Тогда
обСообщитьОбОшибке(СтрокаСообщения, Отказ, Заголовок);
КонецЕсли;
Возврат Отказ;
КонецФункции
Код 1C v 8.х МассивКолонок = Новый Массив;
МассивКолонок.Добавить("Количество");
СсылочныеКолонки = Новый Соответствие;
СсылочныеКолонки["Адрес"] = Справочники.АдресаЯчеек.ПустаяСсылка();
СсылочныеКолонки["Товар"] = Справочники.Номенклатура.ПустаяСсылка();
ПроверкаЗаполненияТабличнойЧасти(Ссылка, "Товары", МассивКолонок, СсылочныеКолонки, Отказ);
//выбирает не заполненные строки
//СсылкаНаОбъект - ссылка на проверяемый документ, ИмяТабЧасти - имя проверяемой табличной части,
//СписокКолонок - массив с именами колонок
//СсылочныеКолонки - соответсвие имен колонок и пустых ссылок типов этих колонок
Процедура ПроверкаЗаполненияТабличнойЧасти(СсылкаНаОбъект, ИмяТабЧасти = "Товары", СписокКолонок, СсылочныеКолонки = Неопределено, Отказ = Ложь, Заголовок = "") Экспорт
ИмяДока = СсылкаНаОбъект.Метаданные().Имя;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
ТекстЗапроса = "ВЫБРАТЬ
| Док.НомерСтроки
|ИЗ
| Документ." + ИмяДока + "." + ИмяТабЧасти + " КАК Док
|ГДЕ
| Док.Ссылка = &Ссылка И (";
СтрокаКолонок = "";
Если СсылочныеКолонки <> Неопределено Тогда
Для каждого Колонка Из СсылочныеКолонки Цикл
ТекстЗапроса = ТекстЗапроса + " Док." + Колонка.Ключ + " = &" + Колонка.Ключ + " ИЛИ";
СтрокаКолонок = СтрокаКолонок + Колонка.Ключ + ", ";
Запрос.УстановитьПараметр(Колонка.Ключ, Колонка.Значение);
КонецЦикла;
КонецЕсли;
Для каждого Колонка Из СписокКолонок Цикл
ТекстЗапроса = ТекстЗапроса + " Док." + Колонка + " = 0 ИЛИ";
СтрокаКолонок = СтрокаКолонок + Колонка + ", ";
КонецЦикла;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, Колонка + " = 0 ИЛИ", Колонка + " = 0)");
Запрос.Текст = ТекстЗапроса;
СтрокаСообщения = "Проверка табличной части на заполнение по колонкам: " + СтрокаКолонок;
Результат = Запрос.Выполнить().Выбрать();
ЕстьОшибки = Ложь;
Пока Результат.Следующий() Цикл
СтрокаСообщения = СтрокаСообщения + Символы.ПС
+ "В строке № " + Формат(Результат.НомерСтроки, "ЧГ=0")
+ " есть не заполненное значение!";
ЕстьОшибки = Истина;
КонецЦикла;
Если ЕстьОшибки Тогда
СообщитьОбОшибке(СтрокаСообщения, Отказ, Заголовок);
КонецЕсли;
КонецПроцедуры
Код 1C v 8.х // Параметры:
// Адрес - адрес файла на сервере
// ЛокальныйПуть - путь для сохранения файла на локальном компьютере
// ВыдаватьСообщения - признак необходимости выдачи сообщений в случае ошибки
// (необязательный, по умолчаню равен Истина)
//
// Возвращаемое значение:
// Число - результат получения файла с сервера
// 0 - успешно;
// 1 - неправильный параметр
// 2 - неправильные код пользователя или пароль для доступа к "закрытой" части сайта
// 3 - ошибка подключения к веб-сайту.
//
Функция ПолучитьФайлССервера(Знач Адрес, Знач ЛокальныйПуть, Знач ВыдаватьСообщения = Истина,
Знач Соединение = Неопределено) Экспорт
Если НЕ ЗначениеЗаполнено(Адрес) ИЛИ НЕ ЗначениеЗаполнено(ЛокальныйПуть) Тогда
ЗаписатьОшибку("Невозможно подключиться к сети Интернет: не инициализированы внутренние переменные.");
Возврат 1;
КонецЕсли;
Если Соединение = Неопределено Тогда
// Установка параметров прокси-сервера
Если ПроксиСерверТребуетАутентификации Тогда
ПроксиСервер = Новый ИнтернетПрокси();
ПроксиСервер.Пользователь = ПользовательПроксиСервера;
ПроксиСервер.Пароль = ПарольПроксиСервера;
КонецЕсли;
// Создание HTTP-соединения с сервером обновлений
Соединение = Новый HTTPСоединение(СерверОбновлений,
,
КодПользователяСервераОбновлений,
ПарольСервераОбновлений,
?(ПроксиСерверТребуетАутентификации, ПроксиСервер, Неопределено));
КонецЕсли;
Попытка
СоздатьКаталог(ПолучитьКаталогФайла(ЛокальныйПуть));
Соединение.Получить(Адрес, ЛокальныйПуть);
Исключение
// "Ошибка аутентификации при доступе Адресу"
ОписаниеОшибки = ОписаниеОшибки();
Если Найти(ОписаниеОшибки, Адрес) > 0 И НЕ Найти(ОписаниеОшибки, "не обнаружен") Тогда
ЗаписатьПредупреждение("Ошибка при обращении к http://" + Соединение.Сервер + "/" + Адрес + "
|" + ОписаниеОшибки);
Если ВыдаватьСообщения Тогда
ОбщегоНазначения.ПредупреждениеОбОшибке("Неправильно указан код пользователя или пароль.");
КонецЕсли;
Возврат 2;
КонецЕсли;
// Файл не обнаружен
Если Найти(ОписаниеОшибки, "не обнаружен") Тогда
Сообщение = "Ошибка при обращении к http://" + Соединение.Сервер + "/" + Адрес + "
|" + ОписаниеОшибки;
ЗаписатьПредупреждение("Ошибка при обращении к http://" + Соединение.Сервер + "/" + Адрес + "
|" + ОписаниеОшибки);
Если ВыдаватьСообщения Тогда
ОбщегоНазначения.СообщитьОбОшибке(Сообщение);
КонецЕсли;
Возврат 3;
КонецЕсли;
// Ошибка работы с Интернет: a timeout was reached
Сообщение = "Ошибка при обращении к http://" + Соединение.Сервер + "/" + Адрес + "
|" + ОписаниеОшибки;
ЗаписатьПредупреждение(Сообщение);
Если ВыдаватьСообщения Тогда
ОбщегоНазначения.СообщитьОбОшибке(Сообщение);
КонецЕсли;
Возврат 3;
КонецПопытки;
ЗаписатьИнформацию("Файл успешно получен (адрес: http://" + Соединение.Сервер + "/" + Адрес +
"; локальный файл: " + ЛокальныйПуть + ").");
Возврат 0;
КонецФункции
Код 1C v 8.х
// Эта функция пересчитывает сумму из валюты ВалютаНач по курсу ПоКурсуНач
// в валюту ВалютаКон по курсу ПоКурсуКон
//
// Параметры:
// Сумма - сумма, которую следует пересчитать;
// ВалютаНач - ссылка на элемент справочника Валют;
// определяет валюты из которой надо пересчитвать;
// ВалютаКон - ссылка на элемент справочника Валют;
// определяет валюты в которую надо пересчитвать;
// ПоКурсуНач - курс из которого надо пересчитать;
// ПоКурсуКон - курс в который надо пересчитать;
// ПоКратностьНач - кратность из которого надо пересчитать (по умолчанию = 1);
// ПоКратностьКон - кратность в который надо пересчитать (по умолчанию = 1);
//
// Возвращаемое значение:
// Сумма, пересчитанная в другую валюту
//
Функция ПересчитатьИзВалютыВВалюту(Сумма, ВалютаНач, ВалютаКон, ПоКурсуНач, ПоКурсуКон,
ПоКратностьНач = 1, ПоКратностьКон = 1 ) Экспорт
Если (ВалютаНач = ВалютаКон) Тогда
// Считаем, что пересчет не нужен.
Возврат Сумма;
КонецЕсли;
Если (ПоКурсуНач = ПоКурсуКон)
и (ПоКратностьНач = ПоКратностьКон) Тогда
// ну, тут и считать нечего...
Возврат Сумма;
КонецЕсли;
Если ПоКурсуНач = 0
или ПоКурсуКон = 0
или ПоКратностьНач = 0
или ПоКратностьКон = 0 Тогда
СообщитьОбОшибке(" при пересчете обнаружен нулевой курс.");
Возврат 0;
КонецЕсли;
Возврат Окр((Сумма * ПоКурсуНач * ПоКратностьКон) / (ПоКурсуКон * ПоКратностьНач), 2);
КонецФункции