Программное создание, заполнение документа и открытие формы (УП, тонкий клиент) Чтобы программно заполнить документ по кнопке, делаем примерно следующее:
1. на форму, в нашем случае документа, добавляем кнопку (Команда и у нее процедура СоздатьПеремещение(Команда))
2. в ее обработчике пишем код создания документа перемещение товаров и заполняем его
Код 1C v 8.3 &НаСервере
Функция СоздатьПеремещениеНаСервере(ДанныеФормы)
ДанныеФормы.Дата=ТекущаяДата();
// ДанныеФормы.Номер="1";
ДанныеФормы.СкладОтправитель = Справочники.Склады.НайтиПоНаименованию("Склад гарантийного обслуживания");
ДанныеФормы.СкладПолучатель = Справочники.Склады.НайтиПоНаименованию("Склад гарантийных");
новСП=Новый СписокЗначений; н=0;
Для Каждого стр из Объект.ДанныеПоГН Цикл
Если стр.ДанныеПроверки=Перечисления.СтатусПроверкиГарантии.зн0 тогда //!В документ перемещение только записи статус=зн0
новСП.Добавить(Строка(стр.НомерЗаводской)); н=н+1;
КонецЕсли;
КонецЦикла;
Если н>0 Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугСерии.Серия КАК Серия,
| РеализацияТоваровУслугСерии.Ссылка.Дата КАК ДатаОтгрузки,
| РеализацияТоваровУслугСерии.Ссылка.Контрагент КАК Контрагент,
| РеализацияТоваровУслугСерии.Ссылка КАК Возврат,
| РеализацияТоваровУслугСерии.Номенклатура,
| ПРЕДСТАВЛЕНИЕ(РеализацияТоваровУслугСерии.Серия) КАК СерияСТР
|ИЗ
| Документ.ВозвратТоваровОтКлиента.Серии КАК РеализацияТоваровУслугСерии
|ГДЕ
| РеализацияТоваровУслугСерии.Серия В
| (ВЫБРАТЬ
| СерииНоменклатуры.Ссылка КАК Ссылка
| ИЗ
| Справочник.СерииНоменклатуры КАК СерииНоменклатуры
| ГДЕ
| СерииНоменклатуры.Наименование В (&Наименование))
|
|УПОРЯДОЧИТЬ ПО
| Серия
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("Наименование", новСП);
ТаблицаЗапроса = Запрос.Выполнить().Выгрузит ь();
Для каждого стр из новСП Цикл
НайденнаяСтрока=ТаблицаЗапроса.Найти(стр.Значение,"СерияСТР");
Если НайденнаяСтрока = Неопределено Тогда
//нет такого
Иначе
нстр=ДанныеФормы.Товары.Добавить();
нстр.Номенклатура = НайденнаяСтрока.Номенклатура;
нстр.Серия=НайденнаяСтрока.Серия;
нстр.КоличествоУпаковок=1;
нстр.Количество=1;
нстр.СтатусУказанияСерий=2;
нстр.СтатусУказанияСерийОтправитель=2;
нстр.СтатусУказанияСерийПолучатель=2;
нстр=ДанныеФормы.Серии.Добавить();
нстр.Номенклатура = НайденнаяСтрока.Номенклатура;
нстр.Серия=НайденнаяСтрока.Серия;
нстр.Количество=1;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат ДанныеФормы;
КонецФункции
&НаКлиенте
Процедура СоздатьПеремещение(Команда)
Форма=ПолучитьФорму("Документ.ПеремещениеТоваров.ФормаОбъекта");
ДанныеФормы=Форма.Объект;
ДанныеФормы=СоздатьПеремещениеНаСервере(ДанныеФормы);
КопироватьДанныеФормы(ДанныеФормы,Форма.Объект);
Форма.Открыть();
КонецПроцедуры
Категория:
Документы Вывод результата запроса на форму УП в таблицу значений (аналог СоздатьКолонки() для УП) при разработке на обычных формах было удобно выводить результат запроса используя метод СоздатьКолоки():
Код 1C v 8.х Процедура ПоискНажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокументоОборот.Этап,
| ДокументоОборот.Отдел,
| ДокументоОборот.ФИО,
| ДокументоОборот.ДатаВремя КАК Дата_Время,
| ДокументоОборот.Документы,
| ДокументоОборот.Примечание,
| ДокументоОборот.Доставка
|ИЗ
| РегистрСведений.ДокументоОборот КАК ДокументоОборот
|ГДЕ
| ДокументоОборот.Документы ПОДОБНОДокументы
| И ДокументоОборот.Доставка.Дата МЕЖДУДатаН ИДатаК
|
|УПОРЯДОЧИТЬ ПО
| ДокументоОборот.ДатаВремя";
Запрос.УстановитьПараметр("Документы", "%"+СокрЛП(Строка(СтрокаПоиска))+"%");
Запрос.УстановитьПараметр("ДатаК", КонПериода);
Запрос.УстановитьПараметр("ДатаН", НачПериода);
Рез=Запрос.Выполнить();
НайденДок = рез.Выгрузит ь();
ЭлементыФормы.НайденДок.СоздатьКолонки();
В управляемом приложении метод СоздатьКолоки() не доступен, ниже представлена процедура, которая отображает на управляемой форме содержимое таблицы значений переданное ей в качестве параметра:
Пример формы:
Код вывода результата запроса на управляемую форму :
Код 1C v 8.2 УП &НаСервере
Процедура СоздатьТаблицуФормы(Знач ИмяПоляТаблицыФормы, Знач ИмяРеквизитаДанныеФормыКоллекция, Знач ТаблицаЗначений)
// Если руками не создали эелемент формы Таблица, то создается программно
Если Элементы.Найти(ИмяПоляТаблицыФормы) = Неопределено Тогда
ЭлементРеквизита = Элементы.Добавить(ИмяПоляТаблицыФормы, Тип("ТаблицаФормы"),);
ЭлементРеквизита.ПутьКДанным = ИмяРеквизитаДанныеФормыКоллекция;
КонецЕсли;
УдаляемыеРеквизиты = Новый Массив;
РеквизитыДляУдаления = ПолучитьРеквизиты(ИмяРеквизитаДанныеФормыКоллекция);
Для Каждого РеквизитУдаления Из РеквизитыДляУдаления Цикл
УдаляемыеРеквизиты.Добавить(ИмяРеквизитаДанныеФормыКоллекция+"."+РеквизитУдаления.Имя);
// Удаляем элементы формы
Элементы.Удалить(Элементы[ИмяПоляТаблицыФормы+РеквизитУдаления.Имя]);
КонецЦикла;
// Добавление реквизитов в таблицу формы
ДобавляемыеРеквизиты = Новый Массив;
Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ИмяРеквизитаДанныеФормыКоллекция, Колонка.Заголовок));
КонецЦикла;
ИзменитьРеквизиты(ДобавляемыеРеквизиты,УдаляемыеРеквизиты);
// Добавление элементов форму
Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
ЭлементРеквизита = Элементы.Добавить(ИмяПоляТаблицыФормы + Колонка.Имя, Тип("ПолеФормы"), Элементы[ИмяПоляТаблицыФормы]);
ЭлементРеквизита.ПутьКДанным = ИмяРеквизитаДанныеФормыКоллекция + "." + Колонка.Имя;
ЭлементРеквизита.Вид = ВидПоляФормы.ПолеВвода;
КонецЦикла;
ЗначениеВРеквизитФормы(ТаблицаЗначений, ИмяРеквизитаДанныеФормыКоллекция);
КонецПроцедуры
&НаСервере
Процедура ВПоискНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугСерии.Серия КАК Серия,
| РеализацияТоваровУслугСерии.Ссылка КАК Реализация,
| РеализацияТоваровУслугСерии.Ссылка.ЗаказКлиента КАК ЗаказКлиента,
| РеализацияТоваровУслугСерии.Ссылка.Контрагент КАК Контрагент,
| РеализацияТоваровУслугСерии.Ссылка.Договор КАК Договор
|ИЗ
| Документ.РеализацияТоваровУслуг.Серии КАК РеализацияТоваровУслугСерии
|ГДЕ
| РеализацияТоваровУслугСерии.Серия В
| (ВЫБРАТЬ
| СерииНоменклатуры.Ссылка КАК Ссылка
| ИЗ
| Справочник.СерииНоменклатуры КАК СерииНоменклатуры
| ГДЕ
| СерииНоменклатуры.Наименование ПОДОБНОНаименование)
|
|УПОРЯДОЧИТЬ ПО
| Серия
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("Наименование", "%"+НомерФН+"%");
РезультатЗапроса = Запрос.Выполнить();
ТаблицаЗапроса = Запрос.Выполнить().Выгрузит ь();
СоздатьТаблицуФормы("ТЗ","ТЗ",ТаблицаЗапроса);
КонецПроцедуры
&НаКлиенте
Процедура ВПоиск(Команда)
ВПоискНаСервере();
КонецПроцедуры
Категория:
Управляемое приложение, Тонкий клиент Отключение предупреждения безопасности в платформе 8.3.9 В версии 8.3.9.2170 была усилена безопасность - теперь система запрашивает подтверждение на запуск внешних обработок, расширений и прочее. Видимо после трояна: Внимание! Первый троян для 1С -запускающий шифровальщика-вымогателя
Реализован механизм защиты от опасных действий. При выполнении потенциально опасного действия система выдает предупреждение, содержащее информацию о выполняемом действии и потенциальной опасности этого действия. К потенциально опасным действиям относятся:
Загрузка внешнего отчета, обработки или расширения конфигурации. Загрузка или обновление конфигурации/расширения. Доступ из внешнего отчета/обработки или расширения к следующим возможностям: Исполнение команды операционной системы. Управление пользователями. Загрузка внешней компоненты. Пользователь имеет возможность разрешить или отклонить потенциально опасное действие. Если действие разрешено, в ряде случаев может потребоваться повторно выполнить разрешенное действие.
Сообщение выглядит так:
Предупреждение безопасности
Открывается "" из файла " C:\.......epf". Рекомендуется обращать внимание на источник, из которого был получен данный файл. Если с источником нет договоренности о разработке дополнительных модулей, или есть сомнения в содержимом файла, то его не рекомендуется открывать, поскольку это может нанести вред компьютеру и данным. Разрешить открывать данный файл. ДА, НЕТ
Решение:
В конфигураторе в свойствах пользователя ИБ убрать флажок "Защита от опасных действий".
Из документации: Отключение механизма защиты от опасных действий
В ряде случае необходимо отключить механизм защиты от опасных действий. Для этого можно воспользоваться следующими возможностями:
1. Выключить флажок Защита от опасных действий (ЗащитаОтОпасныхДействий) в свойствах конкретного пользователя. Это отключит защиту для этого пользователя.
2. Воспользоваться параметром ЗащитаОтОпасныхДействий методов Подключить() менеджеров внешних обработок (отчетов). В этом случае имеется возможность загрузит ь внешнюю обработку (отчет) без запросов пользователя.
3. Воспользоваться свойством ЗащитаОтОпасныхДействий объекта РасширениеКонфигурации перед вызовом метода Записать() этого объекта.
4. Воспользоваться параметром DisableUnsafeActionProtection файла conf.cfg. В этом случае механизм защиты от опасных действий будет отключаться для всех пользователей информационных баз, строки соединения которых удовлетворяют указанным маскам.
Отключение защиты от опасных действий выполняется по следующим правилам (в указанном порядке):
1. Защита считается отключенной, если у текущего пользователя сброшен флажок Защита от опасных действий.
2. Защита считается отключенной, если строка соединения с информационной базой удовлетворяет одному из шаблонов, указанных в параметре DisableUnsafeActionProtection файла conf.cfg.
3. Если внешняя обработка (отчет) подключается с явным образом отключенной защитой с помощью параметра ЗащитаОтОпасныхДействий.
4. Если защита явным образом отключена с помощью свойства расширения ЗащитаОтОпасныхДействий.
Категория:
Администрирование Как показать сообщение пользователю? методы: СообщениеПользователю и ПоказатьОповещениеПользователя В 1С предполагается, что СообщениеПользователю выводятся для того, чтобы сообщить пользователю об ошибках.
А для информирования о выполняемом действии рекомендуется использовать метод встроенного языка ПоказатьОповещениеПользователя() .
СообщениеПользователю выводит сообщение пользователю (после окончания обработки) или сохраняет его в очередь, если сообщение невозможно вывести прямо сейчас.
Пример вывода сообщения на клиенте:
Код 1C v 8.3 Если ЗначениеЗаполнено(объект.ИнтернетМагазин) Тогда
// Все заполнено, обрабатываем
Иначе
сбп=Новый СообщениеПользователю;
сбп.Текст = "Укажите интернет-магазин данные которого Вы загружаете!";
сбп.Поле="ИнтернетМагазин";
сбп.ПутьКДанным = "Объект";
сбп.Сообщить();
КонецЕсли;
При обработке на сервере:
Необходимо зарегистрировать в системе соответствие объекта и имени реквизита формы. Для этого в глобальном контексте реализована функция УстановитьСоответствиеОбъектаИРеквизитаФормы(). Сделать это можно следующим образом:
Код 1C v 8.3 &НаСервере
Процедура ПроцедураВызываемаяСКлиента(ОбъектДанных)
Документ = ДанныеФормыВЗначение(Объект, Тип("ДокументОбъект.ПоступлениеТМЦ")); // Преобразования данных формы в объект
УстановитьСоответствиеОбъектаИРеквизитаФормы(Документ, "Объект"); // Установка соответствия
ДействиеСОбъектом(Документ); // Действия над объектом, в процессе работы которых может возникнуть необходимость вывода сообщений
КонецПроцедуры
В данном фрагменте выполняется преобразование объекта из данных формы в реальный объект и устанавливается его соответствие с реквизитом формы по имени "Объект".
Если в дальнейшем требуется создать сообщение, можно сделать это следующим образом:
Код 1C v 8.3 &НаСервере
Процедура ДействиеСОбъектом(ОбъектДанных)
// Какие либо действия, которые требуют создания сообщения
// Создание сообщения
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "В строке 11 табличной части ""Номенклатура"" не хватает " +
НедостающееКоличество + " " + ЕдиницаИзмеренияНоменклатуры;
Сообщение.Поле = "Номенклатура[10].Количество";
// Привязка объекта к реквизиту формы произойдет за счет
// установленного выше по стеку соответствия методом
// УстановитьСоответствиеОбъектаИРеквизитаФормы
Сообщение.УстановитьДанные(ОбъектДанных);
// Теперь у сообщения заполнено поле ПутьКДанным (установлено имя реквизита формы, до этого была пустая строка),
// и свойство КлючДанных (установлена ссылка на документ, до этого было Неопределено)
// Сообщение выводится пользователю
Сообщение.Сообщить();
// в дальнейшем сообщение будет показано в форме и привязано к
// элементу управления связанного с полем Количество
// в 11-й строке табличной части Номенклатура.
КонецПроцедуры;
В этом фрагменте создается новый объект СообщениеПользователю, в котором запоминается Текст сообщения и указывается Поле объекта, ошибка в данных которого вызвала необходимость вывода сообщения. Информация о том, как объект расположен в форме берется из предварительно запомненной пары "Объект/ИмяРеквизитаФормы". В дальнейшем сообщение будет выведено в окно сообщений формы и привязано к соответствующему элементу управления.
Примеры заполнения свойства Поле объекта СообщениеПользователю ТипШаблонПример Реквизит ИмяРеквизита Контрагент Табличная часть ИмяТабличнойЧасти Скидки Реквизит табличной части ИмяТабличнойЧасти[ИндексСтроки].ИмяРеквизита Номенклатура[10].Количество Реквизит набора записей [ИндексСтроки].ИмяРеквизита [10].Курс
Еще примеры:
Код 1C v 8.3 &НаКлиенте
Процедура ДействиеСОбъектомНаКлиенте(ОбъектДанных)
// Какие либо действия, которые требуют создания сообщения
// Создание сообщения
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "В строке 11 табличной части ""Номенклатура"" не хватает " +
НедостающееКоличество + " " + ЕдиницаИзмеренияНоменклатуры;
Сообщение.Поле = "Номенклатура[10].Количество";
// Привязка объекта к реквизиту формы "вручную"
Сообщение.КлючДанных = ОбъектДанных.Ссылка;
Сообщение.ПутьКДанным = "Объект";
// Сообщение выводится пользователю
Сообщение.Сообщить();
КонецПроцедуры;
&НаСервере
Процедура Сообщить4НаСервере()
Сообщение4 = новый СообщениеПользователю;
Сообщение4.УстановитьДанные(РеквизитФормыВЗначение("Объект"));
Сообщение4.Текст = "4. Сообщение привязанное к реквизиту шапки Организация";
Сообщение4.Поле = "Организация";
Сообщение4.Сообщить();
КонецПроцедуры
// Показываем сообщение из обработки
// КлючДанных и ПутьКДанным - пустые
Сообщение = Новый СообщениеПользователю;
Сообщение.Поле = "Комментарий";
Сообщение.Текст = "Заполните комментарий";
Сообщение.Сообщить();
// Показываем сообщение из документа
// КлючДанных - пустой, ПутьКДанным заполнится автоматически
Сообщение = Новый СообщениеПользователю;
Сообщение.Поле = "Товары[0].Количество";
Сообщение.Текст = "Не заполнено количество товара в первой строке!";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
//////////////////// КОД для ТИПОВЫХ конфигураций, БСП:
//в модуле объекта
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(“Текст ошибки”,
ЭтотОбъект,
"Договор",,
Отказ);
//в форме объекта
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Дублирование пременной'"), ,
"Запросы["+ИдентификаторСтроки+"].ИмяПеременнойЗапроса",//путь к данным
"Объект", Отказ);
ПоказатьОповещениеПользователя - оповещение возникает в правом нижнем углу приложения и сообщает о совершенном действии. В течение нескольких секунд оно постепенно гаснет и пропадает. При этом, если навести на оповещение курсор мышки, оно не гаснет, и есть возможность внимательно его прочитать:
Код 1C v 8.3 ПоказатьОповещениеПользователя(НСтр("ru = 'Выполнение:'"), ПолучитьНавигационнуюСсылку(Объект), "Выгрузка завершена, все ОК!", БиблиотекаКартинок.ПолнотекстовыйПоискДалее);
Код 1C v 8.3 &НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ПолучитьДатуЗапретаРедактирования() >= Объект.Дата Тогда
НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(Объект.Ссылка);
ПоказатьОповещениеПользователя("Только просмотр!",
НавигационнаяСсылка,
"Разрешен только просмотр документа!");
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьДатуЗапретаРедактирования()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Константы.ДатаЗапретаРедактирования
|ИЗ
| Константы КАК Константы";
РезультатЗапроса = Запрос.Выполнить();
Возврат РезультатЗапроса.Выгрузит ь()[0].ДатаЗапретаРедактирования;
КонецФункции
Категория:
Работа с Формой (Диалог) и её элементами Использование синхронных методов на клиенте запрещено Адаптировала обработку под интерфейс Такси Бухгалтерии 3, и получила ошибку:
Ошибка при вызове метода контекста (Выбрать)
Если ДиалогОткрытияФайла.Выбрать() Тогда
по причине:
Использование синхронных методов на клиенте запрещено!
Это вызвано тем, что Использование модальных окон запрещено!
Решение:
Нужно использовать создание объекта «ОписанияОповещения » и вызов другого метода диалога Показать()
Вот пример кода с ошибкой:
Код 1C v 8.2 УП &НаКлиенте
Процедура Выгрузит ь(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Сохранить в файл";
Диалог.Фильтр = "Файл ТЧ документа (*.ftd)|*.ftd|Все файлы (*.*)|*.*";
Диалог.ПолноеИмяФайла = "Выгрузка_"+Строка(Документ.Номер);
Если Диалог.Выбрать() Тогда
ЗначениеВФайл(Диалог.ПолноеИмяФайла, ТПТЧ);
КонецЕсли;
КонецПроцедуры
Исправленный код:
Код 1C v 8.3 &НаКлиенте
Процедура Выгрузит ь(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Сохранить в файл";
Диалог.Фильтр = "Файл ТЧ документа (*.ftd)|*.ftd|Все файлы (*.*)|*.*";
Диалог.ПолноеИмяФайла = "Выгрузка_"+Строка(ВернутьНомерОснования(Объект.Основание));
Диалог.Показать(Новый ОписаниеОповещения("Выгрузит ьЗавершение", ЭтаФорма, Новый Структура("Диалог", Диалог)));
КонецПроцедуры
&НаКлиенте
Процедура Выгрузит ьЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Диалог = ДополнительныеПараметры.Диалог;
Если (ВыбранныеФайлы <> Неопределено) Тогда
Выгрузит ьСервер(Диалог.ПолноеИмяФайла);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура Выгрузит ьСервер(ПолнИмяФайла)
ЗначениеВФайл(ПолнИмяФайла, ЭтаФорма.ТЗ.Выгрузит ь());
КонецПроцедуры
Категория:
Системные Ошибки Функции сохранения таблицы значений в файл и чтения из файла В данном примере хочу привести несколько универсальных функций по выгрузке таблицы значений в файл и дальнейшего чтения из файла:
П орядок программных действий при выгрузке в файл выглядит так:
Подготавливаем таблицу значений (выгружаем из табличной части, выбираем колонки); Конвертируем таблицу значений в табличный документ; Сохраняем табличный документ в MXL. При загрузке таблицы порядок действий такой:
Читаем из файла табличный документ; Конвертируем табличный документ в таблицу значений; Используем эту таблицу значений в своих целях (загружаем в табличную часть). Соответственно файл для хранения данных таблицы имеет расширение *.mxl.
Основные функции для реализации поставленной задачи следующие:
ПреобразоватьТДвТЗ – Функция преобразования табличного документа в таблицу значений.
ПреобразоватьТЗвТД – Функция обратного преобразования таблицы значений в табличный документ.
ПрочитатьТЗИзMXL – Читает из файла данные, определяет колонки таблицы и преобразует эти данные в таблицу значений.
ЗаписатьТЗВMXL – Преобразует таблицу значений в табличный документ и записывает его в файл.
Код 1C v 8.3 // Преобразовать табличный документ в таблицу значений.
//
// Параметры:
// ТабДок - <ТабличныйДокумент> - Исходный табличный документ;
// СтруктураКолонок - <Структура>, <ТаблицаЗначений> - Структура колонок;
// НачалоСтрока - <Число> - Строка начала области;
// НачалоСтолбец - <Число> - Столбец начала области;
// КонецСтрока - <Число> - Строка конца области;
// КонецСтолбец - <Число> - Столбец конца области.
//
// Возвращаемое значение:
// <ТаблицаЗначений> - Полученная таблица значений.
//
Функция ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, Знач КонецСтрока = Неопределено, Знач КонецСтолбец = Неопределено) Экспорт
// Определение габаритов таблицы
Если НачалоСтрока = Неопределено И НачалоСтолбец = Неопределено Тогда
НачалоСтрока = 1;
НачалоСтолбец = 1;
КонецЕсли;
Если НачалоСтрока = Неопределено Тогда
НачалоСтрока = 1;
Пока НЕ ТабДок.Область(НачалоСтрока, НачалоСтолбец).СодержитЗначение
И НачалоСтрока < ТабДок.ВысотаТаблицы
Цикл
НачалоСтрока = НачалоСтрока + 1;
КонецЦикла;
ИначеЕсли НачалоСтолбец = Неопределено Тогда
НачалоСтолбец = 1;
Пока НЕ ТабДок.Область(НачалоСтрока, НачалоСтолбец).СодержитЗначение
И НачалоСтолбец < ТабДок.ШиринаТаблицы
Цикл
НачалоСтолбец = НачалоСтолбец + 1;
КонецЦикла;
КонецЕсли;
КонецСтрока = ?(КонецСтрока = Неопределено, ТабДок.ВысотаТаблицы, КонецСтрока);
КонецСтолбец = ?(КонецСтолбец = Неопределено, ТабДок.ШиринаТаблицы, КонецСтолбец);
// Преобразование
ЭтоТаблица = (ТипЗнч(СтруктураКолонок) = Тип("ТаблицаЗначений"));
ТабЗначений = ПолучитьТаблицуВывода(СтруктураКолонок);
Для ИндексСтроки = НачалоСтрока По КонецСтрока Цикл
СтрокаТЗ = ТабЗначений.Добавить();
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из СтруктураКолонок Цикл
НаименованиеКолонки = ?(ЭтоТаблица, Колонка.Наименование, Колонка.Ключ);
пИндексКолонки = ?(ЭтоТаблица, Колонка.СтолбецОтчёт, ИндексКолонки);
Если ТабДок.Область(ИндексСтроки, пИндексКолонки).СодержитЗначение Тогда
СтрокаТЗ[НаименованиеКолонки] = ТабДок.Область(ИндексСтроки, пИндексКолонки).Значение;
Иначе
СтрокаТЗ[НаименованиеКолонки] = ТабДок.Область(ИндексСтроки, пИндексКолонки).Текст;
КонецЕсли;
ИндексКолонки = ИндексКолонки + 1;
КонецЦикла;
КонецЦикла;
Возврат ТабЗначений;
КонецФункции;
// Преобразовать таблицу значений в табличный документ.
//
// Параметры:
// ТабЗначений - <ТаблицаЗначений> - Исходная таблица значений;
// ТабДок - <ТабличныйДокумент> - Полученный табличный документ. Если параметр не задан,
// то документ создаётся заново и возвращается функцией;
// НачалоСтрока - <Число> - Строка начала области;
// НачалоСтолбец - <Число> - Столбец начала области;
// ВыводитьЗаголовки - <Булево> - Определяет выводить ли имена колонок или нет.
//
// Возвращаемое значение:
// <ТабличныйДокумент> - Полученный табличный документ (возвращает параметр "ТабДок").
//
Функция ПреобразоватьТЗвТД(ТабЗначений, ТабДок = Неопределено, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, ВыводитьЗаголовки = Ложь) Экспорт
Если ТабДок = Неопределено Тогда
ТабДок = Новый ТабличныйДокумент;
КонецЕсли;
// Определение габаритов таблицы
НачалоСтрока = ?(НачалоСтрока = Неопределено, 1, НачалоСтрока);
НачалоСтолбец = ?(НачалоСтолбец = Неопределено, 1, НачалоСтолбец);
// Преобразование
ИндексСтроки = НачалоСтрока;
Если ВыводитьЗаголовки Тогда
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений.Колонки Цикл
ТабДок.Область(ИндексСтроки, ИндексКолонки).Текст = ?(ПустаяСтрока(Колонка.Заголовок), Колонка.Имя, Колонка.Заголовок);
ИндексКолонки = ИндексКолонки + 1;
КонецЦикла;
ИндексСтроки = ИндексСтроки + 1;
КонецЕсли;
Для Каждого Элемент Из ТабЗначений Цикл
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений.Колонки Цикл
ТабДок.Область(ИндексСтроки, ИндексКолонки).СодержитЗначение = Истина;
ТабДок.Область(ИндексСтроки, ИндексКолонки).ТипЗначения = Новый ОписаниеТипов(Колонка.ТипЗначения);
ТабДок.Область(ИндексСтроки, ИндексКолонки).Значение = Элемент[Колонка.Имя];
ИндексКолонки = ИндексКолонки + 1;
КонецЦикла;
ИндексСтроки = ИндексСтроки + 1;
КонецЦикла;
Возврат ТабДок;
КонецФункции;
// Читает табличный документ из файла MXL и преобразует его в таблицу значений.
//
// Параметры:
// ИмяФайла - <Строка> - Путь к файлу MXL;
// СтруктураКолонок - <Структура>, <ТаблицаЗначений> - Структура колонок. Если этот параметр
// не задан, то структура колонок формируется из самого табличного документа;
// ЕстьЗаголовок - <Булево> - Есть ли первая строка с заголовками или нет.
//
// Возвращаемое значение:
// <ТаблицаЗначений> - Полученная таблица значений.
//
Функция ПрочитатьТЗИзMXL(ИмяФайла, СтруктураКолонок = Неопределено, ЕстьЗаголовок = Истина) Экспорт
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла);
Если СтруктураКолонок = Неопределено И ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок.ШиринаТаблицы Цикл
Обл1 = ТабДок.Область(1, ИндексКолонки);
Обл2 = ТабДок.Область(2, ИндексКолонки);
ИмяКолонки = СокрЛП(Обл1.Текст);
ИмяКолонки = ?(Найти(ИмяКолонки, " ") > 0, СтрЗаменить(ТРег(ИмяКолонки), " ", ""), ИмяКолонки);
СтруктураКолонок.Вставить(ИмяКолонки, ?(Обл2.СодержитЗначение, Обл2.ТипЗначения, Новый ОписаниеТипов));
КонецЦикла;
ИначеЕсли СтруктураКолонок = Неопределено И НЕ ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок.ШиринаТаблицы Цикл
Обл2 = ТабДок.Область(1, ИндексКолонки);
ИмяКолонки = "К" + Формат(ИндексКолонки, "ЧДЦ=0; ЧН=0; ЧГ=0");
СтруктураКолонок.Вставить(ИмяКолонки, ?(Обл2.СодержитЗначение, Обл2.ТипЗначения, Новый ОписаниеТипов));
КонецЦикла;
КонецЕсли;
Таблица = ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, ?(ЕстьЗаголовок, 2, 1), 1);
Возврат Таблица;
КонецФункции;
// Сохраняет таблицу значений в файле в виде табличного документа.
//
// Параметры:
// ИмяФайла - <Строка> - Путь к файлу MXL;
// ТабЗначений - <ТаблицаЗначений> - Сохраняемая таблица значений;
// ЕстьЗаголовок - <Булево> - Есть ли первая строка с заголовками или нет.
//
Процедура ЗаписатьТЗВMXL(ИмяФайла, ТабЗначений, ЕстьЗаголовок = Истина) Экспорт
ТабДок = ПреобразоватьТЗвТД(ТабЗначений, Неопределено, 1, 1, ЕстьЗаголовок);
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.MXL);
КонецПроцедуры;
Еще небольшой набор функций для вывода таблицы значений в табличный документ. После формирования табличного документа, - сохраняем его в файл mxl.
Табличный документ можно сохранить a файлы следующих типов:
ANSITXT - Текстовый документ DOCX - документ MS Word HTML HTML3 HTML4 HTML5 MXL MXL7 ODS - Файл Open Office PDF - файл Acrobat Readr TXT - Текстовый документ XLS - файл Excel XLS95 - файл Excel95 XLS97 - файл Excel97 XLSX - файл Excel2010 Код 1C v 8.3 // Получаем таблицу значения из файла.
Функция Загрузит ьТЗизФайла(ИмяФайла)
Путь = КаталогВременныхФайлов() + ИмяФайла;
Текст = Новый ЧтениеТекста(Путь, КодировкаТекста.UTF8);
стрТЗ = Текст.Прочитать();
Текст.Закрыть();
// получим таблицу значений из строки
ТЗ = ЗначениеИзСтрокиВнутр(стрТЗ);
Возврат ТЗ;
КонецФункции
// Заполнить ячейки в строке значениями
//
Функция ЗаписьТЗ2ТабДок(записьТЗ,НомерСтроки,ТабличныйДокумент)
НомерКолонки = 1;
Символ160 = Символ(160);
// цикл по колонкам таблицы
// РезультатЗапроса.Колонки.Количество() // - количество колонок
Для каждого полеТЗ из ЗаписьТЗ цикл
// значения ячейки в Excel
типПоляТЗ = ТипЗнч(полеТЗ);
если типПоляТЗ = Тип("Число") тогда
полеТЗ=Строка(полеТЗ);
полеТЗ=СтрЗаменить(полеТЗ,Символ160,"");
полеТЗ=СтрЗаменить(полеТЗ,",",".");
иначеесли типПоляТЗ = Тип("Строка") тогда
иначе
полеТЗ = строка(полеТЗ);
КонецЕсли;
имяОбласти = "R" + номерСтроки + "C" + НомерКолонки;
имяОбласти = СтрЗаменить(имяОбласти,Символ(160),"");
Ячейка = ТабличныйДокумент.Область(имяОбласти);
Ячейка.Текст = полеТЗ;
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
КонецФункции
// Заполнить наименованиями колонок таблицу
Функция НаимКолонок2Mxl(ТаблицаЗначений,ТабличныйДокумент)
// массКолонки = новый массив();
номерСтроки=1;
номКолонки=1;
ТабличныйДокумент = новый ТабличныйДокумент;
// цикл по коллекции колонок
Для НомКол=0 по ТаблицаЗначений.Колонки.Количество() - 1 Цикл
//Сообщить(Колонка.Имя + "(" + Колонка.ТипЗначения + ")" );
имяКолонки=ТаблицаЗначений.Колонки[НомКол].Имя;
//ТабличныйДокумент.Область(
имяОбласти = "R" + номерСтроки + "C" + номКолонки;
имяОбласти = СтрЗаменить(имяОбласти,Символ(160),"");
Ячейка = ТабличныйДокумент.Область(имяОбласти);
//значениеЯчейки = СтрЗаменить(имяОбласти,Символ(160),"");
Ячейка.Текст = имяКолонки;
// на основе текущего шрифта сделаем Жирный
ЖирныйШрифт = ?(ЖирныйШрифт = Неопределено,Новый Шрифт(Ячейка.Шрифт,,,Истина),ЖирныйШрифт);
Ячейка.Шрифт = ЖирныйШрифт;
номКолонки = номКолонки + 1;
КонецЦикла;
КонецФункции
// Заполнить построчно табличный документ
Функция Таблица2Mxl(ТаблицаЗначений,ТабличныйДокумент)
//Выборка = РезультатЗапроса.Выбрать();
НомСтр=1; // заполняем данными начиная со 2-й строки
// цикл по строкам таблицы
Для каждого записьТЗ из ТаблицаЗначений Цикл
НомСтр = НомСтр + 1;
// цикл по колонкам таблицы
ЗаписьТЗ2ТабДок(записьТЗ,НомСтр,ТабличныйДокумент);
КонецЦикла;
КонецФункции
// Таблица значений в табличный документ
Функция ТаблицаЗначений2Mxl(ТаблицаЗначений,ФайлMxl)
ТабличныйДокумент = новый ТабличныйДокумент;
// вывести колонки
НаимКолонок2Mxl(ТаблицаЗначений,ТабличныйДокумент);
// вывести содержимое таблицы
Таблица2Mxl(ТаблицаЗначений,ТабличныйДокумент);
ТабличныйДокумент.Записать(ФайлMxl,ТипФайлаТабличногоДокумента.MXL);
ТабличныйДокумент.Показать(ФайлMxl,ФайлMxl);
Возврат 0;
КонецФункции
Функция Тест_Выгрузит ьТЗвMxl();
файл_мТЗИсходныеДанные = "мТЗИсходныеДанные.dat";
ТЗ = Загрузит ьТЗизФайла(файл_мТЗИсходныеДанные);
ФайлMxl = КаталогВременныхФайлов() + СтрЗаменить(файл_мТЗИсходныеДанные,".dat",".mxl");
ТаблицаЗначений2Mxl(ТЗ,ФайлMxl);
КонецФункции
Тест_Выгрузит ьТЗвMxl();
Пример выгруженной таблицы значений в файл:
Категория:
Работа с Таблицей Значений Как выгрузит ь все дополнительные обработки и отчеты в каталог? Выгрузит ь все дополнительные обработки и отчеты в каталог всего за пару кликов. Простейшая обработка в один реквизит и команду.
Набросайте элементы на форму и вставьте код в модуль формы обработки. И без всякого скачивания.
Работоспособность проверена на БП 3.0, Документооборот 1.4-2.0, платформы 1С 8.3.7, 8.3.8
Код 1C v 8.3 #Область ВыборКаталогаДляВыгрузки
// процедура вешается на событие начало выбора у реквизита КаталогВыгрузки.
// Чтобы при нажатии на кнопку выбора открылась форма выбора каталога файловой системы.
&НаКлиенте
Процедура КаталогВыгрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
//открываем диалог выбора файла
ДопПараметры = новый Структура;
ДопПараметры.Вставить("ИмяЭлемента","КаталогВыгрузки");
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьВыборКаталога", ЭтаФорма,ДопПараметры);
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
Если ЗначениеЗаполнено(Объект.КаталогВыгрузки) Тогда
ДиалогОткрытияФайла.Каталог = Объект.КаталогВыгрузки;
КонецЕсли;
ДиалогОткрытияФайла.Показать(ОписаниеОповещения);
КонецПроцедуры
// окончание выбора каталога
&НаКлиенте
Процедура ОбработатьВыборКаталога(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
Возврат;
КонецЕсли;
Объект[ДополнительныеПараметры.ИмяЭлемента] = ВыбранныеФайлы[0];
КонецПроцедуры
#КонецОбласти
#Область НажатиеНаКнопку
// кнопка начала выгрузки
&НаКлиенте
Процедура Выгрузит ь(Команда)
ОчиститьСообщения();
// проверка на заполнение реквизита, существовавание каталога, на его "не пустоту"
Если НЕ ЗначениеЗаполнено(Объект.КаталогВыгрузки) Тогда
Сообщить("Укажите каталог для выгрузки");
Возврат;
КонецЕсли;
Каталог = Новый Файл(Объект.КаталогВыгрузки);
Если НЕ Каталог.Существует() Тогда
Сообщить("Указанный каталог не существует");
Возврат;
КонецЕсли;
МассивФайлов = НайтиФайлы(Объект.КаталогВыгрузки,"*.*");
Если МассивФайлов.Количество()>0 Тогда
ОписаниеОповещения = новый ОписаниеОповещения("ПодвержденияЗамещения",ЭтаФорма);
ПоказатьВопрос(ОписаниеОповещения,"В каталоге есть файлы. При выгрузке будет выполнение замещение существующих."+Символы.ПС+"Начать выгрузку?",РежимДиалогаВопрос.ДаНет);
Возврат;
КонецЕсли;
ВыгрузкаНачнись(); // проблем не обнаружили, давайте выгружать уже
КонецПроцедуры
// если пользователь передумал затирать файлы в каталоге, выгрузку делать не будем
&НаКлиенте
Процедура ПодвержденияЗамещения(ЧтоОтветилПользователь, Параметры) Экспорт
Если ЧтоОтветилПользователь = КодВозвратаДиалога.Да Тогда
ВыгрузкаНачнись();
Иначе
Возврат;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СамаВыгрузка
&НаКлиенте
Процедура ВыгрузкаНачнись()
ПолучаемыеФайлы = ПодготовимФайлыНаСервере(ЭтаФорма.УникальныйИдентификатор);
Обработчик = Новый ОписаниеОповещения("ОбработкаРезультатаВыгрузки", ЭтотОбъект);
НачатьПолучениеФайлов(Обработчик, ПолучаемыеФайлы, Объект.КаталогВыгрузки, Ложь);
КонецПроцедуры
&НаСервере
Функция ПодготовимФайлыНаСервере(ИдентификаторФормы)
Массив = Новый Массив;
Выборка = Справочники.ДополнительныеОтчетыИОбработки.Выбрать(); // выберем все в справочнике.
Пока Выборка.Следующий() Цикл
Если ТипЗнч(Выборка.ХранилищеОбработки) = Тип("ХранилищеЗначения") Тогда
Адрес = ПоместитьВоВременноеХранилище(Выборка.ХранилищеОбработки.Получить(),ИдентификаторФормы);
Массив.Добавить(Новый ОписаниеПередаваемогоФайла(Выборка.ИмяФайла, Адрес));
КонецЕсли;
КонецЦикла;
Возврат Массив;
КонецФункции
&НаКлиенте
Процедура ОбработкаРезультатаВыгрузки(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
ПоказатьПредупреждение(,"Выгрузка в каталог завершена",10); // все готово, шеф!
КонецПроцедуры
#КонецОбласти
Автор: Михали Задорнов (MZadornov)
Категория:
Внешние печатные формы, отчеты и обработк… Фоновые задания: Пример запуска выполнения процедуры / функции на сервере Как в 1С производится запуск фоновых заданий, каким образом можно получить список заданий при помощи метода "ПолучитьФоновыеЗадания()?
В одном проекте понадобилось запускать выполнение выгрузки на сайт с сервера.
Пользователь на своем клиенте открывает обработку, устанавливает параметры и нажимает выгрузит ь.
Выгрузка идет не с компьютера клиента, а создается фоновое задание на сервере!
На клиенте в модуле Кнопки Выгрузит ь:
Код 1C v 8.3 Процедура КоманднаяПанель1Выгрузит ьНаСайт(Кнопка)
//Выгружается фоновым заданием на серваке
ПараметрыФоновогоЗадания = Новый Массив;
ПараметрыФоновогоЗадания.Добавить(Группа); //Группа номенклатуры
ФоновыеЗадания.Выполнить("МодульРегламентныхЗаданий.ВыгрузкаПрайсаНАФТП",
ПараметрыФоновогоЗадания, Новый УникальныйИдентификатор,
"Выгрузка прайса на сайт");
ПоказатьОповещениеПользователя("Выгрузка прайса на сайт", ,"Запущено задание выгрузки прайса на сайт, проверьте данные на сайте через 2-3 минуты...", БиблиотекаКартинок.Информация32);
ПараметрыФоновогоЗадания - это переменные функции, они задаются по порядку как определены в вызываемой функции.
На сервере в общем модуле МодульРегламентныхЗаданий:
Код 1C v 8.3 Процедура ВыгрузкаПрайсаНАФТП(Группа) Экспорт
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| ПрайсЛист1СрезПоследних.НоменклатураПрайса,
| ПрайсЛист1СрезПоследних.Цена
|ИЗ
| РегистрСведений.ПрайсЛист.СрезПоследних(, Поставщик = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) КАК ПрайсЛист1СрезПоследних
|ГДЕ
| &Условие
| И ПрайсЛист1СрезПоследних.НоменклатураПрайса.ИДдляСайта > 0";
Если ЗначениеЗаполнено(Группа) Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", "ПрайсЛист1СрезПоследних.НоменклатураПрайса В ИЕРАРХИИ(&НоменклатураПрайса)")
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", "ИСТИНА")
КонецЕсли;
Запрос.УстановитьПараметр("НоменклатураПрайса", Группа);
Выборка = Запрос.Выполнить().Выбрать();
Текст = Новый ТекстовыйДокумент;
Пока Выборка.Следующий() Цикл
НомПрайса = Выборка.НоменклатураПрайса;
ЦенаА = Выборка.Цена;
Цена = Ценообразование.ОкруглитьЦену(ЦенаА * ( 1 + НомПрайса.Наценка20 / 100) + НомПрайса.Надбавка20, НомПрайса.ПорядокОкругления, НомПрайса.ОкруглятьВБольшуюСторону);
Если Цена > 0 Тогда
Текст.ДобавитьСтроку(""+Формат(НомПрайса.ИДдляСайта, "ЧГ=0")+";"+Формат(Цена, "ЧГ=0"));
КонецЕсли;
КонецЦикла;
// запись в текстовый файл
ПутьКФайлВыгр = "\\FG-1\1c_data\naSite\vigruz.csv";//"D:\!!!For1C!!!\naSite\vigruz.csv";
Текст.Записать(ПутьКФайлВыгр, "windows-1251");
КаталогНаSFTPСервере = "/sitetest.ru/public_html/p";
Попытка
ИмяПользователя = "serveruser";
ПарольПользователя = "password";
Сервер = "192.253.6.47";
Порт = "21";
Прокси = Новый ИнтернетПрокси();
Прокси.Пользователь = ИмяПользователя;
Прокси.Пароль = ПарольПользователя;
FTPСоединение = Новый FTPСоединение(Сервер,,ИмяПользователя,ПарольПользователя,,Ложь);
FTPСоединение.УстановитьТекущийКаталог(КаталогНаSFTPСервере);
//FTPСоединение.ПассивныйРежим(Ложь);
ТекущийКаталог = FTPСоединение.ТекущийКаталог();
Исключение
КонецПопытки;
FTPСоединение.Записать(ПутьКФайлВыгр,"vigruz.csv");
//Вызов PHP скрипта для иморта данных из csv файла на сайт
НТТР = Новый HTTPСоединение("sitetest.ru");
ФайлРезультата = ПолучитьИмяВременногоФайла();
НТТР.Получить("/p/import_price.php", ФайлРезультата);
КонецПроцедуры
Как Получить фоновые задания?
Напишем в процедуре обработки нажания следующий код:
Код 1C v 8.2 УП &НаКлиенте
Процедура ПолучитьФоновыеЗадания(Команда)
ПолучитьФоновыеЗаданияНаСервере();
КонецПроцедуры
Текст процедуры на сервере:
Код 1C v 8.2 УП &НаСервере
Процедура ПолучитьФоновыеЗаданияНаСервере()
ПараметрыОтбора = Новый Структура("Наименование", "Тестовое задание");
СписокФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(ПараметрыОтбора);
Для каждого Задание Из СписокФоновыхЗаданий Цикл
Сообщить(Задание.Наименование);
КонецЦикла;
КонецПроцедуры // ПолучитьФоновыеЗаданияНаСервере()
В окно сообщений выведутся наименования выполняющихся и выполненных в 1С фоновых заданий с наименованием "Тестовое задание", так как мы сделали отбор именно по этому наименованию.
Категория:
Регламентные задания, Фоновые задания Фоновые задания 1С, примеры работы и параллельного запуска В рамках выполнения проекта столкнулся с интересной задачей ускорения загрузки данных из других информационных баз. Задача загрузки данных предполагала выполнение к внешней базе несвязанных между собой запросов, результаты которых помещаются в одну таблицу значений. Когда на оптимизацию запроса рука уже не поднималась, приступил к ускорению загрузки с помощью распараллеливания процессов. Отмечу, что элементы кода в данном посте приведены для клиент-серверного варианта и укрупнено для общего понимания подхода.
Что у нас в 1с Предприятии 8.2 имеется для распараллеливания & это фоновые задачи . Метод, который будет вызываться в фоновой задаче, должен быть прописан в серверном общем модуле и быть экспортным. Естественно нам понадобиться в фоновую задачу передавать и забирать значения.
В моем случае передача значений в фоновую задачу происходила через параметры. Метод Загрузит ьИзВИБ имеет два параметра это ВходнойПараметр и АдресВХранилище. ВходнойПараметр это структура, в которую сгружаются все данные, необходимые для проведения загрузки. АдресВХранилище это адрес во временном хранилище, по которому будет передан результат загрузки. Сам код метода фонового задания выглядит так:
Код 1C v 8.х Процедура Загрузит ьИзВИБ(ВходнойПараметр,АдресВХранилище) Экспорт
//Из структуры перегоняем данные в переменные
ТаблицаДляЗаполнения = ВходнойПараметр.ТаблицаДляЗаполнения;
ДанныеОбъекта = ВходнойПараметр.ДанныеОбъекта;
//Тут идет собственно загрузка данных
ВыполнитьЗагрузку(ТаблицаДляЗаполнения,ДанныеОбъекта);
//Возвращаем данные из фоновой задачи в хранилище
ПоместитьВоВременноеХранилище(ТаблицаДляЗаполнения, АдресВХранилище);
КонецПроцедуры
Зачем нам в фоновую задачу передавать адрес во временном хранилище. Наша фоновая задача должна куда-то положить результат, причем так чтобы мы знали где его потом взять.
Для того чтобы запустить фоновые задачи выполняется следующий код:
Код 1C v 8.х МассивАдресовВХранилище = Новый Массив;
МассивЗапущенныхЗаданий = Новый Массив;
Сч = 1;
Пока Сч <= КоличествоПотоков Цикл
Ключ = Новый УникальныйИдентификатор;
ВходнойПараметр = Новый Структура;
ВходнойПараметр.Вставить("ТаблицаДляЗаполнения",ТаблицаДляЗаполнения);
ВходнойПараметр.Вставить("ДанныеОбъекта",ДанныеОбъекта);
//Подготовим адрес в хранилище
АдресВХранилище = ПоместитьВоВременноеХранилище(Неопределено);
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(ВходнойПараметр);
МассивПараметров.Добавить(АдресВХранилище);
МассивАдресовВХранилище.Добавить(АдресВХранилище);
МассивЗапущенныхЗаданий.Добавить(ФоновыеЗадания.Выполнить("ОбщийМодульСервер.Загрузит ьИзВИБ",МассивПараметров, Ключ, "Загрузка"));
Сч = Сч + 1;
КонецЦикла;
Перед запуском фоновой задачи через ФоновыеЗадания.Выполнить() мы формируем массив параметров. Значения из массива параметров переходят в метод фонового задания в качестве параметров. В МассивЗапущенныхЗаданий хранятся все фоновые задачи, которые мы запустили. Теперь надо подождать их ожидания.
ФоновыеЗадания.ОжидатьЗавершения(МассивЗапущенныхЗаданий);
После того как все задачи были завершены, можем приступить к получению из них данных. Для этого мы проходим по всем адресам в хранилище, которые хранятся в массиве МассивАдресовВХранилище . После получения результата фонового задания перегоняем его в общую таблицу.
Код 1C v 8.х Для Каждого ТекАдресВХранилище Из МассивАдресовВХранилище Цикл
ТекТаблица = ПолучитьИзВременногоХранилища(ТекАдресВХранилище);
Для Каждого ТекСтрокаДанные Из ТекТаблица Цикл
НоваяСтрока = НашаОбщаяТаблица.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока,ТекСтрокаДанные);
КонецЦикла;
КонецЦикла;
Вопрос определения оптимального количества потоков выходит за рамки данного поста. А после получения некоторых результатов на рабочих данных пока что выходит и за рамки моего сознания . Но если у вас есть идеи как посчитать нужное количество потоков, пишите в комментариях, с радостью почитаю.
Источник
Категория:
Регламентные задания, Фоновые задания PostgreSQL: установка, настройка, обслуживание PostgreSQL напрямую "из коробки" применяться для использования с 1С Предприятем не может. Необходима именно адаптированная версия от 1С, превращающая PostgreSQL в блокировочник, причем нужно понимать, что блокировки будут накладываться на всю таблицу сразу. Если нужны блокировки на уровне записей, включаем в 1С режим управляемых блокировок и прописываем их в конфигурации ручками. Вывод: необходимо скачать специальный дистрибутив с сайта 1С или взять на диске ИТС.
Установка
Сама установка особых затруднений не вызывает, обратить внимание нужно на правильную инициализацию базы данных, а именно настройку локали, изменить потом это можно только повторной начальной инициализацией. Например, база 1С с украинскими региональными установками в СУБД с установленной русской локалью не загрузит ся. Да и проблемы с сортировкой потом не нужны. Поэтому делаем init в соответствии с нужным языком.
Для русского языка
initdb --locale=ru_RU.UTF-8 --lc-collate=ru_RU.UTF-8 --lc-ctype=ru_RU.UTF-8 --encoding=UTF8 -D /db/postgresql
Для украинского языка
initdb --locale=uk_UA.UTF-8 --lc-collate=uk_UA.UTF-8 --lc-ctype=uk_UA.UTF-8 --encoding=UTF8 -D /db/postgresql
где /db/postgresql ваш каталог данных PostgreSQL. Кодировка, конечно же, UTF-8.
Подробный вариант пересоздания кластера
1.Необходимо выдать полные права на папку в которую мы установили PostgreSQL, обычно это C:\Program Files\PostgreSQL
2.Из под админских прав запускаем cmd. Если это делаете в win7, то запускаем от Администратора.
3.Создаем папку где будет храниться кластер. Например d:\postgredata.
md d:\postgredata
4.Проводим инициализацию кластера вручную с указанием пути где он будет находиться.
“C:\Program Files\PostgreSQL\9.1.2-1.1C\bin\initdb.exe” -D d:\postgredata --locale=Russian_Russia --encoding=UTF8 -U postgres
5.Удаляем службу PostgreSQL, которая была установлена в ходе установки.
sc delete pgsql-9.1.2-1.1C-x64
Где pgsql-9.1.2-1.1C-x64 – Это название службы. Если не знаете название точно, можно посмотреть свойствах службы “PostgreSQL Database Server…” (Пуск – Панель управления – Администрирование – Службы )
6.Создаем новый сервис с указанием нашего кластера
“C:\Program Files\PostgreSQL\9.1.2-1.1C\bin\pg_ctl” register -N pgsql -U postgresql -P пароль -D d:/postgredata
7.Теперь заходим в службы. Пуск – Панель управления – Администрирование – Службы и стартуем нашу службу.
Ошибка СУБД: ERROR: new encoding (UTF8) is incompatible with the encoding of the template database (WIN1251).
HINT: Use the same encoding as in the template database, or use template0 as template.
Вы выбрали неправильную локаль при установке СУБД (WIN1251) для сервера и клиента, нужно изменить на UTF-8 в конфигурации или переустановить СУБД со следующими параметрами:
Внимание при установке НЕ выбирайте локаль Настройки ОС, выбирайте из списка Russian, RussiaНастройка PostgreSQL
Следует помнить о рекомендации 1С не использовать в запросах конструкции ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ и заменять его, используя, например, комбинацию из нескольких левых соединений. Известна также проблема с потерей производительности в запросах, где применяется соединение с виртуальной таблицей СрезПоследних, к ней рекомендуется делать отдельные запросы и сохранять результаты во временных таблицах.
Настройка конфигурации производится редактированем файла postgresql.conf.
Наиболее важные параметры
effective_cache_size = 0,5 от ёмкости RAM
fsync = off отключаем сброс на диск после каждой транзации (Внимание! Применять только при использовании надежного UPS, есть опасность потери данных при неожиданном отключении)
synchronous_commit = off отключаем синхронную запись в лог (риски теже, что и у fsync)
wal_buffers = 0,25 от ёмкости RAM
После настройки не забываем выполнить перезапуск службы:
service postgresql restart
Настройка сети
Для подключения клиентов 1С к серверу извне и работы сервера баз данных, на файрволе, должны быть открыты следующие порты:
Агент сервера (ragent) & tcp:1540 Главный менеджер кластера (rmngr) & tcp:1541 Диапазон сетевых портов, для динамического распределения рабочих процессов & tcp:1560&1591, tcp:5432 & Postgresql. Создадим правило через стандартный интерфейс, либо с помощью команды:
netsh advfirewall firewall add rule name="1Cv8-Server" dir=in action=allow protocol=TCP localport=1540,1541,5432,1560-1590 enable=yes profile=ANY remoteip=ANY interfacetype=LAN
Теперь с другого компьютера мы спокойно запускаем клиент 1С:Предприятия, добавляем существующую информационную базу newdb. Не забываем про лицензии, программной / аппаратной защиты.
Резервное копирование
Создание дампа базы данных делаем командой
su postgres -c 'pg_dump -U postgres -Fc -Z9 -f baza1.sql baza1'
Восстановление из дампа
su postgres -c 'pg_restore -U postgres -c -d baza1 -v baza1.sql'
Периодическое обслуживание
Рекомендуется настроить AVTO VACUUM в файле конфигурации. Но не пренебрегаем и запуском через планировщик принудительной команды.
su postgres -c '/usr/bin/vacuumdb --dbname=$i --analyze --full --quiet'
Просмотр активности PostgreSQL
Иногда полезно видеть чем сейчас занимается сервер. Поможет такая конструкция:
watch -n 1 'ps auxww | grep ^postgres'
Категория:
Администрирование Преобразование ТаблицыЗначений во временную таблицу Код 1C v 8.х Процедура ПреобразоватьТЗвТЗсОписаниемТипов(ТЗ)
ТипизированнаяТЗ = Новый ТаблицаЗначений;
Для й=1 По Тз.Количество() Цикл ТипизированнаяТЗ.Добавить(); //Создаем строки
КонецЦикла;
ДЗТипов = Новый ДеревоЗначений;
ДЗТипов.Колонки.Добавить("ИмяКолонки");
ДЗТипов.Колонки.Добавить("ТипЗначений");
Для Каждого Колонка из Тз.Колонки Цикл
СтрокаКолонки = ДЗТипов.Строки.Добавить();
СтрокаКолонки.ИмяКолонки = Колонка.Имя;
ТекСТрокаТипа = СтрокаКолонки.Строки.Добавить();
ТекСТрокаТипа.ИмяКолонки = Колонка.Имя; //Заполняется для красоты
ТекСТрокаТипа.ТипЗначений = ТипЗнч(тз[0][Колонка.Имя]);
Для Каждого СтокаТЗ из Тз Цикл
ТекТип = ТипЗнч(СтокаТЗ[Колонка.Имя]);
Если НЕ ТекТип = ТекСТрокаТипа.ТипЗначений Тогда
Если СтрокаКолонки.Строки.Найти(ТекТип, "ТипЗначений")=Неопределено Тогда
ТекСТрокаТипа = СтрокаКолонки.Строки.Добавить();
ТекСТрокаТипа.ИмяКолонки = Колонка.Имя;//Заполняется для красоты
ТекСТрокаТипа.ТипЗначений = ТекТип;
КонецЕслИ;
КонецЕслИ;
КонецЦикла;
МассивТипов = СтрокаКолонки.Строки.Выгрузит ьКолонку("ТипЗначений");
ТипизированнаяТЗ.Колонки.Добавить(Колонка.Имя, Новый ОписаниеТипов(МассивТипов),Колонка.Заголовок);
ТипизированнаяТЗ.Загрузит ьКолонку(Тз.Выгрузит ьКолонку(Колонка),Колонка.Имя);
КонецЦикла;
КонецПроцедуры
Источник
Категория:
Запросы Добавить штрихкод Здравствуйте! Такой вопрос: Как в Отчет с помощью построительОтчета засунуть штрихкод?!
ПолучитьМакетПостротеляОтчета() вот из за него начинаются проблемы. Выдаёт только КоличествоНачальныйОстаток и КоличествоКонечныйОстаток. Я так понял в отчет выводится первая картинка тогда как мне надо третью.
ШТРИХКОД ДОБАВЛЯЮ ТАК
Код 1C v 8.3 ТЗ = ПостроительОтчета.Результат.Выгрузит ь();
ТЗ.Колонки.Добавить("Штрихкод",,"Штрихкод");
ПакетДляОтчета = ТЗ;
ОбработкаШК = ВыбираемШК(ТЗ);
ПомещаемШКВПакет(ОбработкаШК);
ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ПакетДляОтчета);
ОтборПериодичность = ДобавитьОтборПериодичность();
ПостроительОтчета.Макет = ПолучитьМакетПостротеляОтчета();
ПостроительОтчета.МакетОформления = _ПолучитьМакетОформления();
ПостроительОтчета.ОформитьМакет();
ПостроительОтчета.Параметры.Вставить("ДатаНач", ?(ДатаНач = Дата('00010101000000'), ДатаНач, Новый Граница(НачалоДня(ДатаНач), ВидГраницы.Включая)));
ПостроительОтчета.Параметры.Вставить("ДатаКон", ?(ДатаКон = Дата('00010101000000'), ДатаКон, Новый Граница(КонецДня(ДатаКон), ВидГраницы.Включая)));
ПостроительОтчета.Параметры.Вставить("ДатаНачала", ?(ДатаНач = Дата('00010101000000'), ДатаНач, НачалоДня(ДатаНач)));
ПостроительОтчета.Параметры.Вставить("ДатаКонца", ?(ДатаКон = Дата('00010101000000'), Дата("39991231"), КонецДня(ДатаКон)));
ПостроительОтчета.Выполнить();
ПостроительОтчета.Вывести(ТабличныйДокумент);
<br>
Категория:
1С Управление производственным предприят… Как выбрать запросом записи регистра сведений и удалить их? В регистре сведений штрих кодов появились ошибочные записи, которые надо было быстро удалить... можно конечно и ручками выбирать и жать Delete, но это не наш метод!
Код 1C v 8.3 Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.Штрихкод,
| Штрихкоды.Владелец,
| Штрихкоды.ТипШтрихкода,
| Штрихкоды.ЕдиницаИзмерения,
| Штрихкоды.ХарактеристикаНоменклатуры,
| Штрихкоды.СерияНоменклатуры,
| Штрихкоды.Качество
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| Штрихкоды.СерияНоменклатуры.ПометкаУдаления";
Результат = Запрос.Выполнить();
РезультатТаблица = Результат.Выгрузит ь();
ТекПозиция = 0;
Для каждого СтрокаЗапроса из РезультатТаблица Цикл
ОбработкаПрерыванияПользователя();
ТекПозиция = ТекПозиция + 1;
Состояние("Выполнено " + Окр(ТекПозиция / РезультатТаблица.Количество() * 100) + "%");
НаборЗаписей = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Штрихкод.Установить(СтрокаЗапроса.Штрихкод);
НаборЗаписей.Отбор.Владелец.Установить(СтрокаЗапроса.Владелец);
НаборЗаписей.Отбор.ТипШтрихкода.Установить(СтрокаЗапроса.ТипШтрихкода);
НаборЗаписей.Отбор.ЕдиницаИзмерения.Установить(СтрокаЗапроса.ЕдиницаИзмерения);
НаборЗаписей.Отбор.ХарактеристикаНоменклатуры.Установить(СтрокаЗапроса.ХарактеристикаНоменклатуры);
НаборЗаписей.Отбор.СерияНоменклатуры.Установить(СтрокаЗапроса.СерияНоменклатуры);
// Удаляем записи
НаборЗаписей.Записать(Истина);
КонецЦикла;
Предупреждение("Обработка закончена.");
Категория:
Регистры сведений Функции получения всех плановых Начислений и Удержаний сотрудника При доработке ЗУПа потребовалось во фронте расчетчика информативно выводить все плановые начисления и удержания по сотруднику на текущий момент. В результате 2 удобные функции, результат возвращают в виде таблицы значений:
Код 1C v 8.3 Функция ПолучитьСписокПлановыхНачислений(Организация, Сотрудник, ДатаО) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПлановыеНачисленияСрезПоследних.Период,
| ПлановыеНачисленияСрезПоследних.ВидРасчета,
| ПлановыеНачисленияСрезПоследних.Показатель1,
| ПлановыеНачисленияСрезПоследних.Валюта1,
| ПлановыеНачисленияСрезПоследних.ТарифныйРазряд1,
| ПлановыеНачисленияСрезПоследних.Показатель2,
| ПлановыеНачисленияСрезПоследних.Валюта2,
| ПлановыеНачисленияСрезПоследних.ТарифныйРазряд2,
| ПлановыеНачисленияСрезПоследних.Показатель3,
| ПлановыеНачисленияСрезПоследних.Валюта3,
| ПлановыеНачисленияСрезПоследних.ТарифныйРазряд3,
| ПлановыеНачисленияСрезПоследних.Показатель4,
| ПлановыеНачисленияСрезПоследних.Валюта4,
| ПлановыеНачисленияСрезПоследних.ТарифныйРазряд4,
| ПлановыеНачисленияСрезПоследних.Показатель5,
| ПлановыеНачисленияСрезПоследних.Валюта5,
| ПлановыеНачисленияСрезПоследних.ТарифныйРазряд5,
| ПлановыеНачисленияСрезПоследних.Показатель6,
| ПлановыеНачисленияСрезПоследних.Валюта6,
| ПлановыеНачисленияСрезПоследних.ТарифныйРазряд6,
| ПлановыеНачисленияСрезПоследних.Действие,
| ПлановыеНачисленияСрезПоследних.ПериодЗавершения,
| ПлановыеНачисленияСрезПоследних.ВидРасчетаЗавершения,
| ПлановыеНачисленияСрезПоследних.ДействиеЗавершения,
| ПлановыеНачисленияСрезПоследних.Показатель1Завершения,
| ПлановыеНачисленияСрезПоследних.Показатель2Завершения,
| ПлановыеНачисленияСрезПоследних.Показатель3Завершения,
| ПлановыеНачисленияСрезПоследних.Показатель4Завершения,
| ПлановыеНачисленияСрезПоследних.Показатель5Завершения,
| ПлановыеНачисленияСрезПоследних.Показатель6Завершения,
| ПлановыеНачисленияСрезПоследних.Валюта1Завершения,
| ПлановыеНачисленияСрезПоследних.Валюта2Завершения,
| ПлановыеНачисленияСрезПоследних.Валюта3Завершения,
| ПлановыеНачисленияСрезПоследних.Валюта4Завершения,
| ПлановыеНачисленияСрезПоследних.Валюта5Завершения,
| ПлановыеНачисленияСрезПоследних.Валюта6Завершения,
| ПлановыеНачисленияСрезПоследних.ТарифныйРазряд1Завершения,
| ПлановыеНачисленияСрезПоследних.ТарифныйРазряд2Завершения,
| ПлановыеНачисленияСрезПоследних.ТарифныйРазряд3Завершения,
| ПлановыеНачисленияСрезПоследних.ТарифныйРазряд4Завершения,
| ПлановыеНачисленияСрезПоследних.ТарифныйРазряд5Завершения,
| ПлановыеНачисленияСрезПоследних.ТарифныйРазряд6Завершения,
| ПлановыеНачисленияСрезПоследних.Регистратор
|ИЗ
| РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций.СрезПоследних(
| &ДатаСреза,
| Организация =ГоловнаяОрганизация
| И Сотрудник =Ссылка) КАК ПлановыеНачисленияСрезПоследних
|ГДЕ
| ВЫБОР
| КОГДА ПлановыеНачисленияСрезПоследних.Действие = ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.Прекратить)
| И ПлановыеНачисленияСрезПоследних.ДействиеЗавершения = ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.ПустаяСсылка)
| ТОГДА ЛОЖЬ
| КОГДА ПлановыеНачисленияСрезПоследних.Действие = ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.Прекратить)
| И ПлановыеНачисленияСрезПоследних.ДействиеЗавершения <> ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.ПустаяСсылка)
| ИДатаСреза < ПлановыеНачисленияСрезПоследних.ПериодЗавершения
| ТОГДА ЛОЖЬ
| КОГДА ПлановыеНачисленияСрезПоследних.ДействиеЗавершения = ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.Прекратить)
| ИДатаСреза >= ПлановыеНачисленияСрезПоследних.ПериодЗавершения
| ТОГДА ЛОЖЬ
| ИНАЧЕ ИСТИНА
| КОНЕЦ";
Запрос.УстановитьПараметр("ГоловнаяОрганизация", Организация);
Запрос.УстановитьПараметр("ДатаСреза", ДатаО);
Запрос.УстановитьПараметр("Ссылка", Сотрудник);
Возврат Запрос.Выполнить().Выгрузит ь();
КонецФункции
Функция ПолучитьСписокПлановыхУдержаний(Организация, Сотрудник, ДатаО) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПлановыеУдержанияСрезПоследних.Период,
| ПлановыеУдержанияСрезПоследних.ВидРасчета,
| ПлановыеУдержанияСрезПоследних.Показатель1,
| ПлановыеУдержанияСрезПоследних.Валюта1,
| ПлановыеУдержанияСрезПоследних.Показатель2,
| ПлановыеУдержанияСрезПоследних.Валюта2,
| ПлановыеУдержанияСрезПоследних.Показатель3,
| ПлановыеУдержанияСрезПоследних.Валюта3,
| ПлановыеУдержанияСрезПоследних.Показатель4,
| ПлановыеУдержанияСрезПоследних.Валюта4,
| ПлановыеУдержанияСрезПоследних.Показатель5,
| ПлановыеУдержанияСрезПоследних.Валюта5,
| ПлановыеУдержанияСрезПоследних.Показатель6,
| ПлановыеУдержанияСрезПоследних.Валюта6,
| ПлановыеУдержанияСрезПоследних.Действие,
| ПлановыеУдержанияСрезПоследних.ПериодЗавершения,
| ПлановыеУдержанияСрезПоследних.ДействиеЗавершения,
| ПлановыеУдержанияСрезПоследних.Показатель1Завершения,
| ПлановыеУдержанияСрезПоследних.Показатель2Завершения,
| ПлановыеУдержанияСрезПоследних.Показатель3Завершения,
| ПлановыеУдержанияСрезПоследних.Показатель4Завершения,
| ПлановыеУдержанияСрезПоследних.Показатель5Завершения,
| ПлановыеУдержанияСрезПоследних.Показатель6Завершения,
| ПлановыеУдержанияСрезПоследних.Валюта1Завершения,
| ПлановыеУдержанияСрезПоследних.Валюта2Завершения,
| ПлановыеУдержанияСрезПоследних.Валюта3Завершения,
| ПлановыеУдержанияСрезПоследних.Валюта4Завершения,
| ПлановыеУдержанияСрезПоследних.Валюта5Завершения,
| ПлановыеУдержанияСрезПоследних.Валюта6Завершения,
| ПлановыеУдержанияСрезПоследних.Регистратор
|ИЗ
| РегистрСведений.ПлановыеУдержанияРаботниковОрганизаций.СрезПоследних(
| &ДатаСреза,
| Организация =ГоловнаяОрганизация
| И Физлицо =Ссылка) КАК ПлановыеУдержанияСрезПоследних
|ГДЕ
| ВЫБОР
| КОГДА ПлановыеУдержанияСрезПоследних.Действие = ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.Прекратить)
| И ПлановыеУдержанияСрезПоследних.ДействиеЗавершения = ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.ПустаяСсылка)
| ТОГДА ЛОЖЬ
| КОГДА ПлановыеУдержанияСрезПоследних.Действие = ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.Прекратить)
| И ПлановыеУдержанияСрезПоследних.ДействиеЗавершения <> ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.ПустаяСсылка)
| ИДатаСреза < ПлановыеУдержанияСрезПоследних.ПериодЗавершения
| ТОГДА ЛОЖЬ
| КОГДА ПлановыеУдержанияСрезПоследних.ДействиеЗавершения = ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.Прекратить)
| ИДатаСреза >= ПлановыеУдержанияСрезПоследних.ПериодЗавершения
| ТОГДА ЛОЖЬ
| ИНАЧЕ ИСТИНА
| КОНЕЦ";
Запрос.УстановитьПараметр("ГоловнаяОрганизация", Организация);
Запрос.УстановитьПараметр("ДатаСреза", ДатаО);
Запрос.УстановитьПараметр("Ссылка", Сотрудник.Физлицо);
Возврат Запрос.Выполнить().Выгрузит ь();
КонецФункции
Категория:
1С Зарплата и Управление Персоналом 2.5 Как обновить классификатор банков Меня часто спрашивают: КАК в 1C Бухгалтерии 3.0 обновить классификатор банков?
Все просто, идем по меню:
"Администрирование - Поддержка и обслуживание - "Загрузит ь классификатор банков"
После этого классификатор будет загружен и обновлен. Можете по БИКу искать нужный вам банк.
Бывает, что при нажатии Загрузит ь классификатор банков выходит сообщение: Классификатор актуален и ничего не грузит
Тогда необходимо в Меню (маленький черный треугольник в верхнем левом углу)
Все функции - Справочники - Классификатор банков - жмем "Загрузит ь классификатор"
У кого нету строки "Все функции": Меню - Сервис - Параметры - ставим галочку "Отображать "Все функции"
Категория:
1С Бухгалтерия 3.0