Перейти к содержанию
16.12.2022 1 мин
Параметр сеанса отсутствует или удален на сервере 1C:Предприятие
Ошибка связанная с обновлением платформы 1С: Предприятие. Рассмотрим простой способ решения.
16.12.2022 1 мин
Параметр сеанса отсутствует или удален на сервере 1C:Предприятие
Ошибка связанная с обновлением платформы 1С: Предприятие. Рассмотрим простой способ решения.
Данная проблема стала возникать на платформе версии 8.3.22.1709 в клиент-серверном режиме работы. Ошибка имеет плавающий характер и получить окно об ошибке достаточно непросто.
Сопутствующие уведомления:
- ПолучитьИзХранилища — возвращает неопределенное значение.
- ЭДО не работает, похоже, потому что сеансы прерываются.
- Ошибка при выполнении запроса POST к ресурсу /e1cib/…
Согласно основным рекомендациям, которые можно найти в Интернете, связанным с данной ошибкой, предлагается очистить серверный кэш, но мне это не помогло. Причина оказалась в сеансовых данных, которые необходимо удалить.
Инструкция по удалению сеансовых данных
- Нажимаем на Пуск, находим ярлык Остановка сервера в папке 1С Предприятие.
- Удаляем папку:
C:Program Files1cv8srvinforeg_1541snccntx...
- Нажимаем на Пуск, находим ярлык Запуск сервера в папке 1С Предприятие.
После удаления сведений о сеансах пользователей сообщение об ошибке появляться не должно.
Алекс Гезанов
Работаю в сервисном центре по ремонту и обслуживанию бытовой техники. За более чем 10 лет трудовой деятельности, я сталкивался с решением большого количества проблем в работе ОС Windows, периферийных устройств, бытовой техники, игровых консолей Playstation и т. д.
Припоминаю, что и у нас такое было. Стала возникать в рабочей файловой базе 1С 8, размещенной в общедоступном каталоге в локальной сети. Т.е. «вчера» база работала исправно, а «сегодня» у пользователей в произвольные моменты времени, при разных событиях и действиях в базе работа пользователя прекращается с возникновением ошибки: Сеанс отсутствует или удален ID= , File=srcSeanceContextImpl.cpp(984)
В какой-то момент, пытаясь «поймать» ошибку, т.к. она имела плавающий характер, работая в режиме 1С Предприятие даже удалось получить окно ошибки, что на изображении выше, но еще дополнительно с кнопкой «Подробно…», нажав на которую, получилось извлечь текст ошибки, но, к сожалению, не удалось зафиксировать изображение окна ошибки с дополнительной кнопкой.
В этом случае получилось, что ошибка была в коде, но потом она не повторялась именно для этого участка кода и в формах ошибки больше не было кнопки «Подробно…». Значит, что дело не в коде, а что на самом деле он не может получить данные, на которые настроен по сторонней причине.
|
|||
MadHead
06.08.12 — 14:21 |
В веб клиенте периодически выскакивает ошибка «Параметр сеанса отсутствует или удален» замечено при попытке формировать отчет. Выскакивает не всегда. Платформа 8.2.15.319. Куда копать? |
||
DrShad
1 — 06.08.12 — 14:23 |
в параметры сеанса и права на них |
||
MadHead
2 — 06.08.12 — 14:25 |
В тонком клиенте подобных ошибок нету. |
||
MadHead
3 — 06.08.12 — 14:56 |
web сервер apache |
||
MadHead
4 — 06.08.12 — 16:20 |
кто-то сталкивался? |
||
MadHead
5 — 20.08.12 — 13:03 |
в моем случае проблема была в нескольких рпхостах на сервере. Отключил проблема исчезла |
||
Maxus43
6 — 20.08.12 — 13:05 |
(5) это ошибка платформы, но её ЕМНИП исправляли в 8.2.15, на 8.2.14 была зарегистрирована… для веба видимо не исправилми |
||
Ksandr
7 — 20.08.12 — 13:06 |
Сталкивался. Смотри оперативную память на сервере приложений |
||
MadHead
8 — 20.08.12 — 13:08 |
(6) Вы видимо путаете с ошибкой «Сеанс отсутствует или удален» |
||
prog2012
9 — 20.08.12 — 13:10 |
(0)возможно так и есть |
||
Ksandr
10 — 20.08.12 — 13:10 |
У нас на проекте возникала такая ошибка когда на сервере не оставалось свободной оперативной памяти. |
||
MadHead
11 — 20.08.12 — 13:11 |
(10) В таком случае выдает ошибку «Сеанс отсутствует или удален» |
||
Maxus43
12 — 20.08.12 — 13:16 |
(8) спутал только ошибку, сама проблема нескольких сеансов и параметров сеанса исправлена
10096672 Попытка получения неинициализированного значения параметра сеанса |
||
Maxus43
13 — 20.08.12 — 13:17 |
* нескольких раб процессов |
||
aspirator23 14 — 20.08.12 — 13:21 |
20 минут? |
Критическая ошибка с таким содержанием вываливается в тонком клиенте,работающем через web-сервер(апач 2.2) удаленно, и просит перезапустить или завершить работу.СУБД postgreSQL 8.3.8 от 1с.Ошибка возникает уже долгое время,выход новых платформ проблему не решает,от офиц. 1с-поддержки ответа не дождешься В локальной сети такая ошибка отсутствует… Может кто сталкивался с подобной ошибкой?
смотреть модуль инициализации параметров сеанса, много думать
наверняка для внешнего соединения не устанавливается параметр, или отсутствует вызов процедуры для установки-получения значения
Понимаешь в чем дело,ошибка плавающая
у меня много пользователей,которые ходят по http,у кого-то такие ошибки валятся,а других нет
останавливаться по ошибке + автоподключение к сеансам и запастись бутербродами и чаем а так — плавающая то плавающая, но закономерность таки есть журнал регистрации смотри
Я даже не уверен,что ошибку можно отловить дебагером
mikecool,собрал статистику ошибок от пользователей,выяснилось,что ошибка исчезает после перезапуска и повторных действий.Счас подключу дебагер+автоподключение
Тэги:
Комментарии доступны только авторизированным пользователям
Оглавление
Форма: Динамическая установка фильтра отбора для заполнения поля (ПараметрыВыбора)
Показ сообщения пользователю с привязкой сообщения к полю из контекста клиента в форме (СообщениеПользователю)
Запрос: Порционное чтение ссылочных данных, порции по 20 строк (устар)
Установка настроек в КомпоновщикНастроекКомпоновкиДанных на форме на основании макета
СКД: Программная установка схемы компоновки данных для компоновщика настроек на форме.
Cериализация через XML Настройки компоновки для передачи ее как параметр (Сохранение настройки как XML)
СКД: Программный вывод отчета
СКД: Вывод отчета внутри объекта отчета со сверткой групп
Блокировка данных по одиночному значению
Программное создание условного оформления в управляемой форме
Срез последних в запросе (курсы валют)
Как удалить пользователей из базы, не зная логина/пароля, но имея доступ к SQL
Нумерация строк в запросе (конкретный пример нумерация в рамках группы справочника)
Динамический список: позиционирование на определенной строке
Произвольные кнопки в диалоге Вопрос и обработка их
СКД: Получить значение текущей иерархии
СКД: Программный запуск отчета и выполнение его при открытии формы
Форма диалога (вопрос) в немодальном режиме
Проверка пересечения одного периода с другим
Как получить чистый текст из HTML
Передача файла с сервера на клиент
Передача файла с клиента на сервер
Платформа: В списке акитивных пользователей появилось приложение ImplAppID. Что это такое?
Подключение своих форм вместо стандартных обработок 1C (недокументированная функция)
Ошибка: Попытка получения неинициализированного значения параметра сеанса
Кодировка кириллицы внутри XML, отдаваемой через SOAP
Показ состояния формирования отчета
Ошибка: “Сеанс отсутствует или удален”
Преобразование массива в строку (для быстрой конкатенации строк)
Быстрая конкатенация большого количества строк при помощи объекта ЗаписьXML
SQL: Получить 100 запросов, на выполнение плана которых с момента компиляции, было затрачено наибольшее число микросекунд. В результирующей выборке будут как тексты, так и планы запросов
SQL: Получить 100 запросов с наибольшим числом выполнений плана с момента компиляции
Таблица значений. Индексирование колонок таблиц значений
Ключ для принудительного запуска в интерфейсе Метро
Управляемая форма. Установка фильтра на элементы при заполнении поля выбора или выборе значения
Сервер 1С. Как вынести фоновые задания в отдельный менеджер «Сервис заданий».
8.3,БСП. Как ненавязчиво проинформировать или спросить пользователя (форма и информацией и галкой “больше не напоминать”)
EXCEL, Толстый клиент : Готовые процедуры для чтения таблиц EXCEL в 1С
SQL: Статистика ожиданий SQL Server’а или пожалуйста, скажите мне, где болит
Использование регулярных выражений для поиска текста (только Windows)
8.3,УФ: Отказ от модальности и событие «ПередУдалением» строки табличной части
Как разбить строку с разделителями
СКД: Как программно прочитать/записать схему компоновки данных
Интерактивный расчет итогов в дереве значений в контексте клиента после интерактивного ввода данных пользователем
Загрузка данных из табличного документа в таблицу значений.
Запрос: Выгрузка справочника или ПВХ в дерево значений
8.3, УФ: Программная загрузка изображений (картинок) в реквизит объекта
8.3,MS SQL, Оптимизация: Перенос БД временных таблиц на RAM диск для ускорения работы запросов на уровне SQL
УФ: Открытие формы записи периодического регистра сведений, если запись отсутствует то программное заполнение полей измерений
Получить предопределенное значение из клиента (перечисление, предопределенное значение справочника, предопределенный счет в плане счетов)
Как выполнить создание на основании программно с открытием формы?
Создание универсального условия в запросе который выполняется как при заполненном параметре так и при его отсутствии.
Добавление картинки после формирования печатной формы на СКД
БСП 2.2. Оптимальное чтение единичного реквизита (или нескольких через запятую реквизитов) объекта (например основного договора).
СКД: Как в ресурсе особым образом оформить сумму например так “(123,45)”
Программное создание карты бизнес-процесса (не проверено)
Ссылка и UUID
Очистка пользовательского кэша (кеша)
Нативная сериализация объектов 1С в XML (на примере таблицы значений)
Нативная сериализация объектов 1С в JSON (на примере таблицы значений)
Подключение сертификата SSL к IIS
Решение проблемы с почтовым доступом 1C на Яндекс или Google
Перенос профиля пользователя сервера предприятия 1С USR1CV8 на Ramdrive.
Регистрация проблем в журнале регистрации связанных с отсутствием прав на объекты у пользователей
Перезагрузка сервера 1С с очисткой кэша сервера из под учетной записи сисадмина
Неожиданно стала появляться ошибка Uncaught error 404.13 на IIS 7.5
СКД: Программная установка отбора данных
Обслуживание MS SQL сервера
Запуск консольной программы с получением результата ее работы
Как организовать ожидание на сервере на заданное количество секунд.
Утечка памяти в платформе версии <=8.3.7
Принудительная эмуляция IE 11 в 1С для корректного отображения современных страниц интернета
Недостаточная производительность конфигуратора на сервере
Решение проблемы открытия внешних ссылок на объекты 1С
СКД: Как получить корректную сумму ресурса у задвоенных записей. Использование новых агрегатных функций. Доступно с 14 релиза 8.2.
Программное создание реквизитов формы на примере Таблицы значений
Способ с помощью запроса в Management Studio проверить включен ли протокол Shared memory
Простое чтение XML Файла через DOM объект
Манипуляция изображениями COM объектом 1С
Список на управляемой форме: Как получить список элементов попадающих под выбранный отбор
СКД: Вывод промежуточного результата таблиц пакетного запроса для отладочных целей с отборами средствами СКД
Прочесть файл EXCEL на сервере в таблицу значений средствами 1С без COM-объекта (с версии 8.3.13)
Обход по таблице значений с группировкой по полю аналогично как по результату запроса
Запрос: порциональная обработка записей
Форма: Динамическая установка фильтра отбора для заполнения поля (ПараметрыВыбора)
МассивВыборка=Новый Массив;
МассивВыборка.Добавить(Новый ПараметрВыбора(«Отбор.ТипОбъектаПривязки»,Объект.ТипОбъектаПривязки));
МассивВыборка.Добавить(Новый ПараметрВыбора(«Отбор.Активный»,Истина));
МассивВыборка.Добавить(Новый ПараметрВыбора(«Отбор.ПометкаУдаления»,Ложь));
Элементы.ЗавершенныеБизнесПроцессы.ПодчиненныеЭлементы.ЗавершенныеБизнесПроцессыШаблонБизнесПроцесса.ПараметрыВыбора=Новый ФиксированныйМассив(МассивВыборка);
Показ сообщения пользователю с привязкой сообщения к полю из контекста клиента в форме (СообщениеПользователю)
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = «Комментарий не указан»;
Сообщение.ИдентификаторНазначения=ЭтаФорма.УникальныйИдентификатор;
Сообщение.Поле = «КомментарийКЗадаче»;//Объект.ИмяТабличнойЧасти[ИндексСтроки].ИмяРеквизита
Сообщение.УстановитьДанные(Объект);
Сообщение.Сообщить();
//Для БСП:
//в модуле объекта
ОбщегоНазначения.СообщитьПользователю(“Текст ошибки”,
ЭтотОбъект,
«Договор»,,
Отказ);
//в форме объекта
ИнтеграцияИС.СообщитьПользователюВФорму(
ЭтаФорма.УникальныйИдентификатор,»Не заполнена номенклатура в строке: «+ЭтаСтрока.НомерСтроки
,,
«ТаблицаЗагрузки[«+(ЭтаСтрока.ПолучитьИдентификатор())+»].Номенклатура»,,
Отказ);
Запрос: Порционное чтение ссылочных данных, порции по 20 строк (устар)
ВЫБРАТЬ ПЕРВЫЕ 20
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка > &Ссылка
УПОРЯДОЧИТЬ ПО
Ссылка
Сначала в «&Ссылка» пустая ссылка, потом последняя ссылка из последней порции
Установка настроек в КомпоновщикНастроекКомпоновкиДанных на форме на основании макета
ДанныйОбъект=РеквизитФормыВЗначение(«Объект»);
ЭтаСхема=ДанныйОбъект.ПолучитьМакет(«СхемаЗапросаЗаполненияДокументов»);
Настройки = ЭтаСхема.ВариантыНастроек.Основной.Настройки;
АдресСхемы = ПоместитьВоВременноеХранилище(ЭтаСхема,ЭтаФорма.УникальныйИдентификатор);
НастройкаФильтров.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
НастройкаФильтров.ЗагрузитьНастройки(Настройки);
СКД: Программная установка схемы компоновки данных для компоновщика настроек на форме.
СхемаДанных=Новый СхемаКомпоновкиДанных;
ИД=СхемаДанных.ИсточникиДанных.Добавить();
ИД.Имя=»ИсточникДанных»;
ИД.ТипИсточникаДанных=»Local»;
ЭтотНабор=СхемаДанных.НаборыДанных.Добавить(Тип(«НаборДанныхЗапросСхемыКомпоновкиДанных»));
ЭтотНабор.АвтоЗаполнениеДоступныхПолей=Истина;
ЭтотНабор.Запрос=»Выбрать * из «+Объект.ТипОбъекта;
ЭтотНабор.ИсточникДанных=ИД.Имя;
Настройки = СхемаДанных.ВариантыНастроек.Основной.Настройки;
АдресСхемы = ПоместитьВоВременноеХранилище(СхемаДанных,ЭтаФорма.УникальныйИдентификатор);
ОтборДанных.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));//ОтборДанных — реквизит формы с типом Компоновщик настроек
ОтборДанных.ЗагрузитьНастройки(Настройки);
Cериализация через XML Настройки компоновки для передачи ее как параметр (Сохранение настройки как XML)
Пример записи настроек:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, КомпоновщикНастроек.Настройки);
Возврат ЗаписьXML.Закрыть();
Пример загрузки:
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Текст);
Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип(«НастройкиКомпоновкиДанных»));
СКД: Программный вывод отчета
//Получаем схему из макета
СхемаКомпоновкиДанных = ПолучитьМакет(«ОсновнаяСхемаКомпоновкиДанных»);//Из схемы возьмем настройки по умолчанию
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;//Помещаем в переменную данные о расшифровке данных
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;//Формируем макет, с помощью компоновщика макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;//Передаем в макет компоновки схему, настройки и данные расшифровки
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);//Выполним компоновку с помощью процессора компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);//Очищаем поле табличного документа
Результат.Очистить();//реквизит формы//Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода
.Вывести(ПроцессорКомпоновкиДанных);
СКД: Вывод отчета внутри объекта отчета со сверткой групп
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
//Формируем макет, с помощью компоновщика макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
//Передаем в макет компоновки схему, настройки и данные расшифровки
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
//Выполним компоновку с помощью процессора компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
//Очищаем поле табличного документа
ДокументРезультат.Очистить();
//Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
ДокументРезультат.ПоказатьУровеньГруппировокКолонок(0);
ДокументРезультат.ПоказатьУровеньГруппировокСтрок(0);
КонецПроцедуры
Блокировка данных по одиночному значению
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить(«РегистрСведений.блНумераторДокументов»);
ЭлементБлокировки.УстановитьЗначение(«Нумератор», ВыборкаДетальныеЗаписи.Ссылка);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Программное создание условного оформления в управляемой форме
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| СБС_ЦветаРаскраскиПомещенийПоДолеЗатрат.Цвет
|ИЗ
| РегистрСведений.СБС_ЦветаРаскраскиПомещенийПоДолеЗатрат КАК СБС_ЦветаРаскраскиПомещенийПоДолеЗатрат»;
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ЭлементУсловногоОформления=УсловноеОформление.Элементы.Добавить();
ФильтрЭлемента=ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ФильтрЭлемента.ЛевоеЗначение=Новый ПолеКомпоновкиДанных(«ЦветаРаскраскиЗатраты.Цвет»);
ФильтрЭлемента.ВидСравнения=ВидСравненияКомпоновкиДанных.Равно;
ФильтрЭлемента.ПравоеЗначение=ВыборкаДетальныеЗаписи.Цвет;
ФильтрЭлемента.Использование=Истина;
ЦветФона=ЭлементУсловногоОформления.Оформление.Элементы.Найти(«ЦветФона»);
ЦветФона.Значение=ВыборкаДетальныеЗаписи.Цвет;
ЦветФона.Использование=Истина;
ОформляемыеПоля=ЭлементУсловногоОформления.Поля.Элементы.Добавить();
ОформляемыеПоля.Использование=Истина;
ОформляемыеПоля.Поле=Новый ПолеКомпоновкиДанных(«ЦветаРаскраскиЗатратыЦвет»);
КонецЦикла;
Срез последних в запросе (курсы валют)
ВЫБРАТЬ РАЗЛИЧНЫЕ
| КурсыВалют.Курс,
| КурсыВалют.Кратность,
| ВыборкаСчетов.Ссылка
|ИЗ
| ВыборкаСчетов КАК ВыборкаСчетов
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| МАКСИМУМ(КурсыВалют.Период) КАК Период,
| ВыборкаСчетов.Дата КАК Дата,
| КурсыВалют.Валюта КАК Валюта
| ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВыборкаСчетов КАК ВыборкаСчетов
| ПО КурсыВалют.Период <= ВыборкаСчетов.Дата
| И (КурсыВалют.Валюта = &USD)
|
| СГРУППИРОВАТЬ ПО
| КурсыВалют.Валюта,
| ВыборкаСчетов.Дата) КАК СрезПоследних
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
| ПО СрезПоследних.Период = КурсыВалют.Период
| И СрезПоследних.Валюта = КурсыВалют.Валюта
| ПО (СрезПоследних.Дата = ВыборкаСчетов.Дата)
|»
Как удалить пользователей из базы, не зная логина/пароля, но имея доступ к SQL
Надо очистить таблицу Users и в таблице Params удалить запись users.usr
- use <Имя базы в SQL>
- delete from [dbo].[v8users] ;
- delete FROM [dbo].[Params] where FileName=’users.usr’;
Нумерация строк в запросе (конкретный пример нумерация в рамках группы справочника)
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
Номенклатура.Родитель КАК Родитель,
КОЛИЧЕСТВО(Номенклатура_1.Ссылка) КАК Номер
ИЗ
Справочник.Номенклатура КАК Номенклатура
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура_1
ПО Номенклатура.Наименование >= Номенклатура_1.Наименование
И Номенклатура.Родитель = Номенклатура_1.Родитель
СГРУППИРОВАТЬ
ПО
Номенклатура.Родитель,
Номенклатура.Ссылка
Динамический список: позиционирование на определенной строке
ТекущаяСтрока = Элементы.Список.ТекущаяСтрока;
СтруктураПараметров = Новый Структура(«ТекущаяСтрока», ТекущаяСтрока);
ОткрытьФорму(«РегистрНакопления.Взаиморасчеты.ФормаСписка», СтруктураПараметров, , Истина);
Произвольные кнопки в диалоге Вопрос и обработка их
Действие = «ВыполнитьУдаление»;
СписокКнопок = Новый СписокЗначений;
СписокКнопок.Добавить(Действие, НСтр(«ru = ‘Выполнить удаление'», «ru»));
СписокКнопок.Добавить(КодВозвратаДиалога.Отмена);
Оповещение = Новый ОписаниеОповещения(
«УдалитьВыполнитьВопросЗавершение», ЭтотОбъект, Действие);
ПоказатьВопрос(Оповещение,
НСтр(«ru = ‘После удаления настроек форма будет открываться с настройками по умолчанию.'», «ru»),
СписокКнопок, , Действие);
&НаКлиенте
Процедура УдалитьВыполнитьВопросЗавершение(Результат, Действие) Экспорт
Если Результат = Действие Тогда
УдалитьНаСервере();
ОбновитьСписокФорм();
ПрименитьФильтр();
ПоказатьОповещениеПользователя(НСтр(«ru = ‘Настройки удалены'», «ru»));
КонецЕсли;
КонецПроцедуры
СКД: Получить значение текущей иерархии
Выбор
Когда Уровень() > 0
Тогда ВычислитьВыражение(«Ссылка», , «Иерархия»)
Иначе Null
Конец
СКД: Программный запуск отчета и выполнение его при открытии формы
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
//Вставить содержимое обработчика.
ПараметрыФормы = Новый Структура(«Отбор,СформироватьПриОткрытии», Новый Структура(«Документ,ИсходныйДокумент»,Получитьпараметр(ПараметрКоманды),ИсходныйДокумент(ПараметрКоманды)),Истина);
ОткрытьФорму(«Отчет.блДеревоДокументов.Форма», ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
КонецПроцедуры
Форма диалога (вопрос) в немодальном режиме
&НаКлиенте
Процедура ЗаполнитьРасшифровку(Команда)
ОО=Новый ОписаниеОповещения(«ЗаполнитьРасшифровкуКлиент»,ЭтотОбъект,Неопределено);
ПоказатьВопрос(ОО,»Расшифровка не пуста, перезаполнить?»,РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьРасшифровкуКлиент(Результат,ДополнительныеДанные=Неопределено) Экспорт
Если Результат=КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
ЗаполнитьРасшифровкуНаСервере();
КонецПроцедуры
Проверка пересечения одного периода с другим
Если Макс(Начало1,Начало2) < Мин(Конец1,Конец2) Тогда
Прересекаются = Истина;
Иначе
Прересекаются = Ложь;
КонецЕсли;
Как получить чистый текст из HTML
Построитель = Новый ПостроительDOM;
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.УстановитьСтроку(ЭтотОбъект.ТекстСообщенияHTML);
ДокументHTML = Построитель.Прочитать(ЧтениеHTML); ЭтотОбъект.ТекстСообщенияЧистыйТекст=ДокументHTML.Тело.ТекстовоеСодержимое;
Передача файла с сервера на клиент
&НаКлиенте
Процедура ИнициироватьФайлШаблона()
ИмяФайлаНаСервере=ПолучитьXLSССервера();
ИмяФайла=ПолучитьИмяВременногоФайла(«xls»);
ПолучитьФайл(ИмяФайлаНаСервере, ИмяФайла, Ложь);
КонецПроцедуры
Функция ПолучитьXLSССервера()
ОтчетОбъект=РеквизитФормыВЗначение(«Отчет»); ПоместитьВоВременноеХранилище(ОтчетОбъект.ПолучитьМакет(«HeatmapsXLS»));
КонецФункции
Передача файла с клиента на сервер
&НаКлиенте
Процедура Загрузить(Команда)
НачатьПомещениеФайла(Новый ОписаниеОповещения(«ВыполнитьЗагрузку»,ЭтаФорма),,,Истина,УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьЗагрузку(Результат,Адрес,ВыбранноеИмяФайла,ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
ЗагрузитьНаСервере(Адрес);
Сообщить(«Завершили»);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ЗагрузитьНаСервере(Знач Адрес)
ФайлВременногоХранилища=ПолучитьИзВременногоХранилища(Адрес);
ИмяФайла=ПолучитьИмяВременногоФайла();
ФайлВременногоХранилища.Записать(ИмяФайла);
УдалитьИзВременногоХранилища(Адрес);
MXL=Новый ТабличныйДокумент;
MXL.Прочитать(ИмяФайла);
УдалитьФайлы(ИмяФайла);
//тут полезные действия
КонецПроцедуры
Платформа: В списке акитивных пользователей появилось приложение ImplAppID. Что это такое?
Это имя приложения имеет временный сеанс, который создается на время внутренних операций, выполняемых платформой до аутентификации пользователя ИБ, но требующих доступа к данным ИБ. Сеанс необходим, чтобы могли работать штатные механизмы проверки прав, сбора статистики и т.д.
Зависание этого сеанса на значительное время, вероятно, является проявлением ошибки платформы.
Подключение своих форм вместо стандартных обработок 1C (недокументированная функция)
ДД = Новый ДвоичныеДанные(«C:UsersAlexDesktopВнешняяОбработка1.epf»);
НовЭлемент = Справочники.Обработка.СоздатьЭлемент();
НовЭлемент.Хранилище = Новый ХранилищеЗначения(ДД);
НовЭлемент.Записать();
ExternalDataProcessors.Connect(ПолучитьНавигационнуюСсылку(НовЭлемент.Ссылка, «Хранилище»),«StandardActiveUsers», false);
или
ДвоичныеДанные = Новый ДвоичныеДанные(«C:ВнешняяОбработка1.epf»);
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
ВнешниеОбработки.Подключить(Адрес, «StandardActiveUsers», false);
где, имена стандартных обработок
QueryWizard.epf
StandardActiveUsers.epf
StandardDeleteMarkedObjects.epf
StandardDocumentsPosting.epf
StandardEventLog.epf
StandardExternalDataSourcesManagement.epf
StandardFindByRef.epf
StandardFullTextSearchManagement.epf
StandardTotalsManagement.epf
Ошибка: Попытка получения неинициализированного значения параметра сеанса
Версия 8.2.18.102
Получили такую же ошибку. Решили следующим образом
Ишем строку с помошью запорса
SELECT [FileName]
,[Creation]
,[Modified]
,[Attributes]
,[DataSize]
,[BinaryData]
FROM [Имя базы].[dbo].[ConfigSave]
where FileName like ‘%commit%’and Attributes = 0 and DataSize = 0
Если нашлась, удаляем
delete
FROM [Имя базы].[dbo].[ConfigSave]
where FileName like ‘%commit%’and Attributes = 0 and DataSize = 0
После того как первый раз зашли в конфигуратор надо обязательно сделать не динамическое обновление.
При первом входе в базу, скорее всего, будет долго висеть. У меня это заняло примерно 15 минут.
Кодировка кириллицы внутри XML, отдаваемой через SOAP
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку(«UTF-8»); /// !!!!
………………………………………..
ТекстПосланияСтрокой = ЗаписьXML.Закрыть();
// это блок обязательно
ИмяФайла = ПолучитьИмяВременногоФайла();
ЗТ = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.ANSI); // !!!!!
ЗТ.Закрыть();
// это шаманство, но если создать новый файл и сразу в него записать что нам надо — ничего не выйдет
// кодировка останется UTF-8
ЗТ = Новый ЗаписьТекста(ИмяФайла,,,Истина); // Истина! обязательно
ЗТ.Записать(ТекстПосланияСтрокой);
ЗТ.Закрыть();
…………………………………………………..
Бредятька = ПолучитьИмяВременногоФайла();
Попытка // ещё одна бредятька.
Ответ = Соединение.ОтправитьДляОбработки(ИмяФайла, «/api/»+ИмяФункцииСайта, Бредятька,Заголовки);
Т.е. сначала формируем XML в кодировке UTF-8, затем создаём пустой файл в кодировке windows-1251, а затем переоткрываем его и перезаписываем исходный XML в новый текстовый файл. В итоге кодировка получается windows-1251
Далее уже этот файл отправляем сайту.
Показ состояния формирования отчета
Элементы.Результат.ОтображениеСостояния.Текст = «Отчёт формируется, подождите…»;
Элементы.Результат.ОтображениеСостояния.Картинка = БиблиотекаКартинок.ДлительнаяОперация48;
Элементы.Результат.ОтображениеСостояния.Видимость = Истина;
ОбновитьОтчет();
Элементы.Результат.ОтображениеСостояния.Видимость = Ложь;
Ошибка: “Сеанс отсутствует или удален”
Причиной возникновения ошибки «Сеанс отсутствует или удален» является разрыв TCP-соединения между тонким клиентом и рабочим процессом сервера, возможно, из-за временной неработоспособности какого-то сетевого оборудования между компьютером сервера 1С:Предприятия и проблемным клиентским компьютером.
Преобразование массива в строку (для быстрой конкатенации строк)
Функция ВСтроку(Знач Массив)
СтрокаВнутр=СтрЗаменить(ЗначениеВСтрокуВнутр(Массив), «»»},» + Символы.ПС + «{«»S»»,»»», «»);
СтрокаВнутр2=Сред(СтрокаВнутр,Найти(СтрокаВнутр,Массив[0]));
Возврат Лев(СтрокаВнутр2,СтрДлина(СтрокаВнутр2)-6);
КонецФункции
Быстрая конкатенация большого количества строк при помощи объекта ЗаписьXML
ЗаписьXML=Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьБезОбработки(«Строка 1”);
ЗаписьXML.ЗаписатьБезОбработки(«Строка 2”);
…
ЗаписьXML.ЗаписатьБезОбработки(«Строка 1000”);
…
ЗаписьXML.ЗаписатьБезОбработки(«Строка N*1000”);
РезультирующаяСтрока=ЗаписьXML.Закрыть();
SQL: Получить 100 запросов, на выполнение плана которых с момента компиляции, было затрачено наибольшее число микросекунд. В результирующей выборке будут как тексты, так и планы запросов
SELECT TOP 100 qs.total_worker_time, qp.query_plan, st.text, qs.*, st.dbid
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
order by qs.total_worker_time desc
SQL: Получить 100 запросов с наибольшим числом выполнений плана с момента компиляции
SELECT qs.execution_count, qp.query_plan, st.text, qs.*, st.dbid
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
order by qs.execution_count desc
Таблица значений. Индексирование колонок таблиц значений
Для ситуации вида:
ТаблицаДанных.Индексы.Добавить(«Номенклатура»);
ТаблицаДанных.Индексы.Добавить(«ПорядковыйНомер»);
буде созданы 2 простых индекса. Для создания составного индекса его поля следует перечислить через запятую. Платформа не использует левую часть индекса, следовательно для быстрого поиска по разным комбинациям полей надо создавать свои индексы.
ТаблицаДанных.Индексы.Добавить(«Номенклатура,ПорядковыйНомер»);
Ключ для принудительного запуска в интерфейсе Метро
itaxi
Управляемая форма. Установка фильтра на элементы при заполнении поля выбора или выборе значения
- Использовать событие: АвтоПодбор и НачалоВыбора, вторая нужна для табличных частей
- Отключить галку ИсторияВыбораПриВводе
- Заполнить процедуры, пример:
&НаКлиенте
Процедура СистемаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
Если Ожидание=0 Тогда//Активация поля, см. документацию
СтандартнаяОбработка=Ложь;
СистемаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка);
КонецЕсли;
Если Элемент.ПараметрыВыбора.Количество()=0 Тогда
Возврат;
КонецЕсли;
ДанныеВыбора=Новый СписокЗначений;
ДанныеВыбора.ЗагрузитьЗначения(Элемент.ПараметрыВыбора[0].Значение);
КонецПроцедуры
&НаКлиенте
Процедура СистемаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
МассивЭлементов=ПолучитьСписокСистем(Объект.Локомотив);
МассивВыборка=Новый Массив;
МассивВыборка.Добавить(Новый ПараметрВыбора(«Отбор.Ссылка»,МассивЭлементов));
Элемент.ПараметрыВыбора=Новый ФиксированныйМассив(МассивВыборка);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьСписокСистем() — функция расположена в форме, работает на стороне сервера без контекста, возвращающая массив. Очень важно учитывать что функция должна вызываться вне контекста!
Сервер 1С. Как вынести фоновые задания в отдельный менеджер «Сервис заданий».
Порядок действий следующий:
В консоли кластеров открываем список менеджеров кластера, в дереве по вот такому пути (Сервер 8.2 — Кластеры — 1541 — Рабочие серверы — «Наш сервер 1С» — Менеджеры кластера) и создаем еще один Менеджер кластера. Далее в этом же списке выбираем «Главный менеджер кластера» который был создан системой автоматически, находим нужный нам сервис и вызываем контекстное меню этого сервиса. Там будет первый пункт «Переместить сервис на другой менеджер кластера». Жмем. После на сколько я помню потребуется перезагрузка сервера 1С. Все.
8.3,БСП. Как ненавязчиво проинформировать или спросить пользователя (форма и информацией и галкой “больше не напоминать”)
- Определить место для хранения булева значения, например это может быть сохраняемый реквизит формы. Например реквизит имеет имя “НеИнформироватьПользователяОПустомСписке”
- Разместить код обработки реакции пользователя:
&НаКлиенте
Процедура ОбработкаРеакцииПользователя(Параметр1,Параметр2) Экспорт
Если Неопределено=Параметр1 Тогда
Возврат;
КонецЕсли;
Параметр1.Свойство(«БольшеНеЗадаватьЭтотВопрос»,
НеИнформироватьПользователяОПустомСписке);
КонецПроцедуры
- Разместить в нужном месте процедуру открытия формы информирования:
Если Не НеИнформироватьПользователяОПустомСписке Тогда
СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(
Новый ОписаниеОповещения(«ОбработкаРеакцииПользователя»,ЭтаФорма),
«Текст информирования»,
РежимДиалогаВопрос.ОК);//можно использовать любые кнопки доступные в системном перечислении РежимДиалогаВопрос
КонецЕсли;
EXCEL, Толстый клиент : Готовые процедуры для чтения таблиц EXCEL в 1С
http://pro1c.org.ua/index.php?showtopic=7771
SQL: Статистика ожиданий SQL Server’а или пожалуйста, скажите мне, где болит
http://habrahabr.ru/post/216309/
Использование регулярных выражений для поиска текста (только Windows)
RegExp = Новый COMОбъект(«VBScript.RegExp»); // создаем объект для работы с регулярными выражениями
//Параметры:
RegExp.MultiLine = Истина; // истина — текст многострочный, ложь — одна строка
RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске
RegExp.Pattern = «(#{.+?})»;//что ищем, подробнее тут: Регулярные выражения (описание)
Matches = RegExp.Execute(ТекстДокумента);//где ищем
Для Итератор=0 По Matches.Count-1 Цикл//массив найденных подстрок
Match = Matches.Item(Итератор);//тут целиковая найденная строка
НайденнаяПодстрока=Match.Value;
//SubMatches=Match.SubMatches;//выборка подстроки в подстроке (зависит от регулярного выражения)
КонецЦикла;
8.3,УФ: Отказ от модальности и событие «ПередУдалением» строки табличной части
&НаКлиенте
Процедура ПоступлениеПередУдалением(Элемент, Отказ)
Отказ = Истина;
ПредупредитьОбУдаленииСтроки(«Поступление», Элемент.ТекущиеДанные.НомерСтроки);
КонецПроцедуры
&НаКлиенте
Процедура ПредупредитьОбУдаленииСтроки(ТабличнаяЧасть, НомерСтроки)
ПоказатьВопрос(Новый ОписаниеОповещения(«ПредупредитьОбУдаленииСтрокиЗавершение», ЭтотОбъект,
Новый Структура(«ТабличнаяЧасть, НомерСтроки», ТабличнаяЧасть, НомерСтроки)),
«Будет удалена вся текущая строка документа. Продолжить удаление?»,РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ПредупредитьОбУдаленииСтрокиЗавершение(Ответ, Параметры) Экспорт
ОтказОтУдаления = (Ответ = КодВозвратаДиалога.Да);
Если Ответ = КодВозвратаДиалога.Да Тогда
Объект[Параметры.ТабличнаяЧасть].Удалить(Параметры.НомерСтроки —1);
КонецЕсли;
КонецПроцедуры
Как разбить строку с разделителями
Разделитель = «,»;
Строки = СтрЗаменить(«январь, февраль, март», Разделитель, Символы.ПС);
Для Индекс = 1 По СтрЧислоСтрок(Строки) Цикл
Сообщить(СтрПолучитьСтроку(Строки, Индекс));
КонецЦикла;
Устарело, в 8.3 следует использовать СтрРазделить(<Строка>, <Разделитель>, <ВключатьПустые>)
СКД: Как программно прочитать/записать схему компоновки данных
// записать схему
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайлаПравил);
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СхемаКомпоновкиДанных);
ЗаписьXML.Закрыть();
// прочитать схему
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайлаПравил);
//ЧтениеXML.УстановитьСтроку(НайтиСтрокуЗапроса.СхемаКомпоновкиДанныхТаблицы); — если чтение не из файла, а из строки
СхемаКомпоновкиДанных = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип(«СхемаКомпоновкиДанных»));
НастройкиКомпоновкиДанных = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
// только настройки
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайлаПравил);
НастройкиКомпоновкиДанных = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип(«НастройкиКомпоновкиДанных»));
Интерактивный расчет итогов в дереве значений в контексте клиента после интерактивного ввода данных пользователем
Добавить числовой реквизит формы ТекущееЗначениеПоказателя
Функция ПолучитьИмяКолонкиЧисловогоПоказателя переводит имя колонки в имя реквизита дерева, можно воспльзоваться свойством ПутьКДанным и его отработать, только нужно имя без точки.
//события
&НаКлиенте
Процедура ДеревоРаботПередНачаломИзменения(Элемент, Отказ)
Если ПустаяСтрока(ПолучитьИмяКолонкиЧисловогоПоказателя()) Тогда
Возврат;
КонецЕсли;
Отказ=Элемент.ТекущиеДанные.ПолучитьЭлементы().Количество()>0;//значение предков редактировать нельзя
КонецПроцедуры
&НаКлиенте
Процедура ДеревоРаботПриАктивизацииЯчейки(Элемент)
ЗаполнитьТекущееЗначение();
КонецПроцедуры
&НаКлиенте
Процедура ДеревоРаботПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
ЗаполнитьТекущееЗначение();
КонецПроцедуры
&НаКлиенте
Процедура ДеревоРаботВнедрениеПриИзменении(Элемент)
ЭлементТекущиеДанные=Элементы.ДеревоРабот.ТекущиеДанные;
Если Неопределено=ЭлементТекущиеДанные Тогда
Возврат;
КонецЕсли;
//<<считаем сумму по колонкам
ИмяЭлемента=ПолучитьИмяКолонкиЧисловогоПоказателя();
Отказ=ЭлементТекущиеДанные.ПолучитьЭлементы().Количество()>0;
Если Отказ Тогда
ЭлементТекущиеДанные[ИмяЭлемента]=ТекущееЗначениеПоказателя;//итоговые строки не даем редактировать пользователю — восстанавливаем значение, которое запомнили перед изменением пользователем
Иначе
Если Не ПустаяСтрока(ИмяЭлемента) Тогда
ЭтиДанныеРекурсия=ЭлементТекущиеДанные;
Пока Истина Цикл
ЭтотРодитель=ЭтиДанныеРекурсия.ПолучитьРодителя();
Если Неопределено=ЭтотРодитель Тогда
Прервать;
КонецЕсли;
ЭтотРодитель[ИмяЭлемента]=ЭтотРодитель[ИмяЭлемента]-ТекущееЗначениеПоказателя+ЭтиДанныеРекурсия[ИмяЭлемента];//считаем сумму с поправкой на прошлое изменение
ЭтиДанныеРекурсия=ЭтотРодитель;
Пока Истина Цикл//тут считаем сумму для всех предков
ЭтотРодитель=ЭтиДанныеРекурсия.ПолучитьРодителя();
Если Неопределено=ЭтотРодитель Тогда
Прервать;
КонецЕсли;
ИтоговаяСумма=0;
Для каждого ЭтотЭлемент Из ЭтотРодитель.ПолучитьЭлементы() Цикл
ИтоговаяСумма=ИтоговаяСумма+ЭтотЭлемент[ИмяЭлемента];
КонецЦикла;
ЭтотРодитель[ИмяЭлемента]=ИтоговаяСумма;
ЭтиДанныеРекурсия=ЭтотРодитель;
КонецЦикла;
Прервать;
КонецЦикла;
КонецЕсли;
КонецЕсли;
//>>посчитали
КонецПроцедуры
//вспомогательная процедура
&НаКлиенте
Процедура ЗаполнитьТекущееЗначение()
ИмяЭлемента=ПолучитьИмяКолонкиЧисловогоПоказателя();
Если ПустаяСтрока(ИмяЭлемента) Тогда
Возврат;
КонецЕсли;
ТекущееЗначениеПоказателя=Элементы.ДеревоРабот.ТекущиеДанные[ИмяЭлемента];
КонецПроцедуры
Загрузка данных из табличного документа в таблицу значений.
//на сервере
MXL=Новый ТабличныйДокумент;
MXL.Прочитать(АдресФайла);
Построитель=Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(MXL.Область(1, 1, MXL.ВысотаТаблицы, MXL.ШиринаТаблицы));
Построитель.Выполнить();
ТЗ = Построитель.Результат.Выгрузить();
Запрос: Выгрузка справочника или ПВХ в дерево значений
Запрос = Новый Запрос();
Запрос.Текст =
«ВЫБРАТЬ
| ПланВидовХарактеристик1.Ссылка КАК Реквизит1
|ИЗ
| ПланВидовХарактеристик.ПланВидовХарактеристик1 КАК ПланВидовХарактеристик1
|
|УПОРЯДОЧИТЬ ПО
| Реквизит1 ИЕРАРХИЯ»;
Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
8.3, УФ: Программная загрузка изображений (картинок) в реквизит объекта
- Добавляем реквизит объекта “ДанныеКартинки” тип ХранилищеЗначения
- Добавляем в реквизит формы реквизи “СсылкаНаКартинку”, типа неограниченная строка
- Переносим его на форму и меняем вид на “Поле картинки”, свойство “РазмерКартинки”=АвтоРазмер
- Добавляем команду “ВыбратьИзображение”, переносим на форму и прописываем код обработки команды. пример:
&НаКлиенте
Процедура ВыбратьИзображение(Команда)
Оповещение=Новый ОписаниеОповещения(«ОбработкаВыбораФайла»,ЭтаФорма);
НачатьПомещениеФайла(Оповещение,,,Истина,УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбораФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
СсылкаНаКартинку=Адрес;
КонецПроцедуры
- Добавляем 2 события на форму для записи и чтения изображения:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(СсылкаНаКартинку) Тогда
ТекущийОбъект.ДанныеКартинки=Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(СсылкаНаКартинку));
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) СсылкаНаКартинку=ПолучитьНавигационнуюСсылку(Объект.Ссылка,»ДанныеКартинки»);
КонецПроцедуры
8.3,MS SQL, Оптимизация: Перенос БД временных таблиц на RAM диск для ускорения работы запросов на уровне SQL
Платформа 8.3 стремится использовать MVCC, если СУБД поддерживает этот функционал. MS SQL для реализации доступа с помощью мультиверсионности активно задействует tempdb
Рекомендуется при наличии ОЗУ от 8 ГБ.
- Используется решение от DataRam: http://memory.dataram.com/products-and-services/software/ramdisk
- В настройках программы выбрать View-Advanced
- Вкладка Settings: указать размер диска (для персонального использования не более 4 ГБ),FAT32
- Вкладка Load/Save: указать адрес файла куда будет сохраняться данные диска при завершении и старте Windows, нажать на галочки Load Disk Image at Startup и Save Disk Image at Shutdown
- Запустить RAM диск
- Необходимо поменять адреса первичный файлов БД в MS SQL и журнала tempdb на диск RAM (поставить начальный размер по-умолчению ⅔ на файл БД и ⅓ на файл журнала, поставить авторасширение “Нет”) и добавить файлы на случай недостатка места на RAM диске (см. пример ниже)
USE master
GO
Alter DATABASE tempdb
MODIFY FILE (NAME = tempdev_ram, FILENAME = ‘Z:tempdb_ram.mdf’)
GO
Alter DATABASE tempdb
MODIFY FILE (NAME = templog_ram, FILENAME = ‘Z:templog_ram.ldf’)
GO
- Перезапустить MS SQL
При возврате обратно.
- Выполнить обратную переброску файлов (шаг 6.)
- Очистить файлы, пример:
- use tempdb;
- GO
- DBCC SHRINKFILE (templog_ram, EMPTYFILE);
- GO
- Удалить файлы
- Перезапустить MS SQL
УФ: Открытие формы записи периодического регистра сведений, если запись отсутствует то программное заполнение полей измерений
- У измерений регистра в свойствах проставить галку “Заполнять из данных заполнения”
- Примерный программный код:
&НаКлиенте
Процедура ДоверенностьПредставительБалансодержателяНажатие(Элемент, СтандартнаяОбработка)
СтруктураЗаполнения=Новый Структура(«Подписант»,Объект.ПредставительБалансодержателя);
ОткрытьФормуЗаписиДоверенности(СтруктураЗаполнения);
СтандартнаяОбработка=Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуЗаписиДоверенности(СтруктураЗаполнения)
СтруктураЗаполнения.Вставить(«Период»,ТекущаяДатаСеанса());
Если Не ЕстьЗаписьПоДоверенности(СтруктураЗаполнения) Тогда
СтруктураДанных=Новый Структура(«ЗначенияЗаполнения»,СтруктураЗаполнения)
Иначе
ЭтотМассив=Новый Массив;
ЭтотМассив.Добавить(СтруктураЗаполнения);
КлючЗаписи = Новый(«РегистрСведенийКлючЗаписи.Доверенности», ЭтотМассив);
СтруктураДанных=Новый Структура(«Ключ»,КлючЗаписи)
КонецЕсли;
ОткрытьФорму(«РегистрСведений.Доверенности.ФормаЗаписи»,СтруктураДанных,ЭтаФорма);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЕстьЗаписьПоДоверенности(СтруктураЗаполнения)
Запрос = Новый Запрос;
Запрос.Текст = «ВЫБРАТЬ
| ДоверенностиСрезПоследних.Период,
| ДоверенностиСрезПоследних.Подписант
|ИЗ
| РегистрСведений.Доверенности.СрезПоследних(, Подписант = &Подписант) КАК ДоверенностиСрезПоследних»;
Запрос.УстановитьПараметр(«Подписант», СтруктураЗаполнения.Подписант);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
СтруктураЗаполнения.Период=Выборка.Период;
Возврат Истина;
КонецЦикла;
Возврат Ложь;
КонецФункции
Получить предопределенное значение из клиента (перечисление, предопределенное значение справочника, предопределенный счет в плане счетов)
ТекущаяСтрока.ТехническоеСостояние=ПредопределенноеЗначение(«Перечисление.ЛТПС_ТехническиеСостояния.Исправен»);
Описание:
Возвращает ссылку на предопределенный элемент из предопределенных данных, прикладных перечислений и точек маршрута бизнес-процессов, а также значения системных перечислений.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Примечание:
Результат выполнения кэшируется при первом обращении до изменения конфигурации или версии платформы.
Как выполнить создание на основании программно с открытием формы?
Обычно, в большинстве случаев когда объект вводится на основании, нужно открыть пользователю форму нового объекта, который введен на основании какого-то объекта.
В этом случае достаточно просто передать параметр Основание в процедуру открытия формы:
ПараметрыФормы = Новый Структура(«Основание», Объект.Ссылка);
ОткрытьФорму(«Документ.ПриходТовара.ФормаОбъекта», ПараметрыФормы);
При этом отработает процедура ОбработкаЗаполнения в модуле объекта и, соответственно, те алгоритмы заполнения, которые в ней описаны.
Если же объект, который вводится на основании, нужно сразу записать в базу данных не показывая его форму пользователю, то тогда можно использовать метод объекта Заполнить().
Создать новый объект, и вызвать у него метод Заполнить(), в который передать значение, на основании которого должен быть создан этот объект.
НовыйДокумент = Документы.РасходнаяНакладная.СоздатьДокумент();
НовыйДокумент.Заполнить(ВыбранныйКлиент);
В результате этих действий будет выполнен обработчик события ОбработкаЗаполнения, расположенный в модуле нового объекта.
Следует заметить, что событие ОбработкаЗаполнения есть не только у объектных данных (документов, справочников и т.п.), но и у регистра сведений, в модуле объекта РегистрСведенийНаборЗаписей.<имя>.
Создание универсального условия в запросе который выполняется как при заполненном параметре так и при его отсутствии.
Запрос=Новый Запрос(«ВЫБРАТЬ ПЕРВЫЕ 1
| ЛТПС_ЛокомотивыНаОбслуживанииСрезПоследних.Локомотив
|ИЗ
| РегистрСведений.ЛТПС_ЛокомотивыНаОбслуживании.СрезПоследних(
| &Дата,
| ВЫБОР
| КОГДА &КонтрагентЗаполнен
| ТОГДА Контрагент = &Контрагент
| ИНАЧЕ ИСТИНА
| КОНЕЦ
| И Локомотив.Наименование = &НомерЛокомотива) КАК ЛТПС_ЛокомотивыНаОбслуживанииСрезПоследних
|ГДЕ
| ЛТПС_ЛокомотивыНаОбслуживанииСрезПоследних.Статус = &Статус»);
Запрос.УстановитьПараметр(«Контрагент», Контрагент);
Запрос.УстановитьПараметр(«КонтрагентЗаполнен», ЗначениеЗаполнено(Контрагент));
…
Добавление картинки после формирования печатной формы на СКД
СКД не позволяет выводить картинки штатными средствами. Картинку можно добавить после того как отработал СКД.
…
//Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
НовыйРисунок=ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
НовыйРисунок.Картинка=БиблиотекаКартинок.Логотип;
НовыйРисунок.РазмерКартинки=РазмерКартинки.АвтоРазмер;
НовыйРисунок.ГраницаСверху=Ложь;
НовыйРисунок.ГраницаСлева=Ложь;
НовыйРисунок.ГраницаСправа=Ложь;
НовыйРисунок.ГраницаСнизу=Ложь;
НовыйРисунок.Расположить(ТабличныйДокумент.Область(«R1C2:R9C8»));
БСП 2.2. Оптимальное чтение единичного реквизита (или нескольких через запятую реквизитов) объекта (например основного договора).
- Разместить в общем модуле сервера (ОбщийМодульСервер) функцию, пример:
Функция ПолучитьОсновнойДоговор(Знач Контрагент) Экспорт
СтруктураДанных=ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Контрагент, «ОсновнойДоговор»);//для нескольких: «Наименование, ИНН, КПП, ОсновнойДоговор»
Возврат СтруктураДанных.ОсновнойДоговор;
КонецФункции
2. В форме объекта разметить процедуру:
&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
Объект.Договор=ОбщийМодульСервер.ПолучитьОсновнойДоговор(Объект.Контрагент);
КонецПроцедуры
СКД: Как в ресурсе особым образом оформить сумму например так “(123,45)”
В выражение ресурса добавить «(«+Строка(Сумма(Ресурс))+»)»
http://its.1c.ru/db/v83doc#bookmark:dev:TI000000582
Программное создание карты бизнес-процесса (не проверено)
Через объект XDTO достаточно просто со схемой работать. По крайней мере, достаточно наглядно код выглядит. При этом главное добавить точки, их расположение и координаты линий, а всякие цвета/шрифты можно и непосредственно в графической схеме задавать. Зато можно шестиугольные точки действия делать, например, если линий более 4 в point добавить
СхемаXDTO = СериализаторXDTO.ЗаписатьXDTO(Новый ГрафическаяСхема);
СхемаXDTO.gridVerticalStep = 10;
СхемаXDTO.gridHorizontalStep = 10;
СхемаXDTO.enableGrid = Истина;
ЭлементСхемы = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«http://v8.1c.ru/8.2/data/graphscheme», «GraphSchemeItem»));
ЭлементСхемы.itemId = 1;
ЭлементСхемы.itemType = 5; //Действие
ЭлементСхемы.itemCode = «ТочкаСтарта»;
ЭлементСхемы.itemTabOrder = ЭлементСхемы.itemId;
ЭлементСхемы.pointUUID = Строка(Новый УникальныйИдентификатор());
СтрокаXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«http://v8.1c.ru/8.1/data/core», «LocalStringType»));
Строка = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«http://v8.1c.ru/8.1/data/core», «LocalStringItemType»));
Строка.lang = «#»;
Строка.content = «Представление действия»;
СтрокаXDTO.item.Добавить(Строка);
ЭлементСхемы.itemTitle = СтрокаXDTO;
ЭлементСхемы.backColor = «auto»;
// Прямоугольник точки
ЭлементСхемы.rectLeft = 10;
ЭлементСхемы.rectRight = 100;
ЭлементСхемы.rectTop = 10;
ЭлементСхемы.rectBottom = 100;
// Координаты линий точки
Координата = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«http://v8.1c.ru/8.2/data/graphscheme», «Point»));
Координата.x = ЭлементСхемы.rectLeft;
Координата.y = ЭлементСхемы.rectTop;
ЭлементСхемы.point.Добавить(Координата);
Координата = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«http://v8.1c.ru/8.2/data/graphscheme», «Point»));
Координата.x = ЭлементСхемы.rectRight — 1;
Координата.y = ЭлементСхемы.rectTop;
ЭлементСхемы.point.Добавить(Координата);
Координата = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«http://v8.1c.ru/8.2/data/graphscheme», «Point»));
Координата.x = ЭлементСхемы.rectRight — 1;
Координата.y = ЭлементСхемы.rectBottom — 1;
ЭлементСхемы.point.Добавить(Координата);
Координата = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«http://v8.1c.ru/8.2/data/graphscheme», «Point»));
Координата.x = ЭлементСхемы.rectLeft;
Координата.y = ЭлементСхемы.rectBottom — 1;
ЭлементСхемы.point.Добавить(Координата);
СхемаXDTO.item.Добавить(ЭлементСхемы);
ГрафическаяСхема = СериализаторXDTO.ПрочитатьXDTO(СхемаXDTO);
Сообщить(ГрафическаяСхема.ЭлементыГрафическойСхемы.Количество());
Имя = ПолучитьИмяВременногоФайла(«grs»);
ГрафическаяСхема.Записать(Имя);
Сообщить(Имя);
ОбъектСхемы = РедактированиеГрафическойСхемы.ПолучитьОбъектXDTO();
РедактированиеГрафическойСхемы.ДобавитьЭлемент(ОбъектСхемы, «Действие»);
РедактированиеГрафическойСхемы.ДобавитьЭлемент(ОбъектСхемы, «Старт»);
РедактированиеГрафическойСхемы.ДобавитьЭлемент(ОбъектСхемы, «Завершение»);
ГрафическаяСхема = РедактированиеГрафическойСхемы.ПолучитьСхему(ОбъектСхемы);
Ссылка и UUID
Ссылка и UUID — это разные вещи. Но при этом существует однозначное преобразование UUID в ссылку и наоборот. Ссылка представляет собой массив из 16 байт. Если рассматривать UUID как последовательность байт, то получается что в ссылке те же самые байты переставлены в другом порядке. Определение структуры GUID можно найти в файле Guiddef.h Windows SDK. Выглядит она следующим образом:
typedef struct _GUID {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[ 8 ];
} GUID;
В ссылке данные переставлены следующим образом:
— Data4 — 8 байт
— 1-й байт Data3
— 0-й байт Data3
— 1-й байт Data2
— 0-й байт Data2
— 3-й байт Data3
— 2-й байт Data3
— 1-й байт Data3
— 0-й байт Data3
При автоматической генерации ссылок, UUID’ы, используемые для получения ссылок, генерируются в Windows с помощью функции Win32 API UuidCreateSequential().
Такой алгоритм генерации ссылок дает очень компактные индексы по ссылкам в файловой базе данных, так как в терминальных страницах индекса (листьях дерева) для упаковки ключей используется общий префикс. Другими словами, на терминальной странице индекса целиком обязательно записывается только первый ключ. Если последующий ключ имеет общий префикс с предыдущим, то для последующего ключа записываются только отличающиеся хвостовые байты.
Очистка пользовательского кэша (кеша)
clearcache.bat
If Exist %USERPROFILE%AppDataRoaming1C1Cv82 (
rem Удаляем все файлы в 7
Del /F /Q %USERPROFILE%AppDataRoaming1C1Cv82*.*
Del /F /Q %USERPROFILE%AppDataLocal1C1Cv82*.*
rem Удаляем все каталоги в 7
for /d %%i in («%USERPROFILE%AppDataRoaming1C1Cv82*») do rmdir /s /q «%%i»
for /d %%i in («%USERPROFILE%AppDataLocal1C1Cv82*») do rmdir /s /q «%%i»
)
If Exist %USERPROFILE%Local SettingsApplication Data1C1Cv82 (
rem Удаляем все файлы в XP
Del /F /Q %USERPROFILE%Local SettingsApplication Data1C1Cv82*.*
Del /F /Q %USERPROFILE%Application Data1C1Cv82*.*
rem Удаляем все файлы в XP
for /d %%i in («%USERPROFILE%Local SettingsApplication Data1C1Cv82*») do rmdir /s /q «%%i»
for /d %%i in («%USERPROFILE%Application Data1C1Cv82*») do rmdir /s /q «%%i»
)
If Exist %USERPROFILE%AppDataRoaming1C1Cv8 (
rem Удаляем все файлы в 7
Del /F /Q %USERPROFILE%AppDataRoaming1C1Cv8*.*
Del /F /Q %USERPROFILE%AppDataLocal1C1Cv8*.*
rem Удаляем все каталоги в 7
for /d %%i in («%USERPROFILE%AppDataRoaming1C1Cv8*») do rmdir /s /q «%%i»
for /d %%i in («%USERPROFILE%AppDataLocal1C1Cv8*») do rmdir /s /q «%%i»
)
If Exist %USERPROFILE%Local SettingsApplication Data1C1Cv8 (
rem Удаляем все файлы в XP
Del /F /Q %USERPROFILE%Local SettingsApplication Data1C1Cv8*.*
Del /F /Q %USERPROFILE%Application Data1C1Cv8*.*
rem Удаляем все файлы в XP
for /d %%i in («%USERPROFILE%Local SettingsApplication Data1C1Cv8*») do rmdir /s /q «%%i»
for /d %%i in («%USERPROFILE%Application Data1C1Cv8*») do rmdir /s /q «%%i»
)
pause
Нативная сериализация объектов 1С в XML (на примере таблицы значений)
Пример: нужно из одной базы получить в другую базу таблицу значений через COM соединение
V8 = Новый COMОбъект(«V83.COMConnector»);
Connect = V8.Connect(СтрокаПодключения);
ОбъектXDTO=Connect.СериализаторXDTO.ЗаписатьXDTO(COMАкцииИМ);//COMАкцииИМ — COM объект таблицы значений из первой базы
ЗаписьХМЛ=Connect.NewObject(«ЗаписьXML»);
ЗаписьХМЛ.УстановитьСтроку();
Connect.ФабрикаXDTO.ЗаписатьXML(ЗаписьХМЛ, ОбъектXDTO);
ТекстXML=ЗаписьХМЛ.Закрыть();//получили текст XML
ТипОбъектаXDTO=ФабрикаXDTO.Тип(«http://v8.1c.ru/8.1/data/core»,»ValueTable»);
ЧтениеXML=Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстXML);
XDTOАкцииИМ=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипОбъектаXDTO);
XDTOАкцииИМ.Проверить();
Сериализатор=Новый СериализаторXDTO(ФабрикаXDTO);
АкцииИМ=Сериализатор.ПрочитатьXDTO(XDTOАкцииИМ);//получили таблицу значений в нужной базе
Нативная сериализация объектов 1С в JSON (на примере таблицы значений)
V8 = Новый COMОбъект(«V83.COMConnector»);
Connect = V8.Connect(СтрокаПодключения);
ЗаписьJSON=Connect.NewObject(«ЗаписьJSON»);
ЗаписьJSON.УстановитьСтроку();
Connect.СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON,COMТаблицаЗначений);//COMТаблицаЗначений — исходная таблица которую получаем из базы источника
ТекстJSON=ЗаписьJSON.Закрыть();
ЧтениеJSON=Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстJSON); ЭтаТаблицаЗначений=СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON,Тип(«ТаблицаЗначений»));//ЭтаТаблицаЗначений — таблица в базе приемника
Подключение сертификата SSL к IIS
https://ssl.com.ua/clients/knowledgebase.php?action=displayarticle&id=22
https://technet.microsoft.com/ru-ru/library/cc732906(v=ws.10).aspx
Для сохранения приватного ключа:
Зайдите в: Certificates в оснастке MMC, если ее нет, то:
- Откройте окно командной строки.
- Введите mmc и нажмите клавишу ВВОД.Обратите внимание, что для просмотра сертификатов в хранилище локального компьютера необходимо иметь роль администратора.
- В меню Файл выберите команду Добавить или удалить оснастку.
- Нажмите кнопку Добавить.
- В диалоговом окне Добавление и удаление оснасток выберите Сертификаты.
- Нажмите кнопку Добавить.
Выберите Requests (Запросы)
Выберите All tasks (Все действия)
Выберите Export (Экспортировать, обязательно включить в экспорт закрытый ключ) в файл privatekey.pfx
Скачать и развернуть OpenSSL
Расшифровать ключ через openSSL:
openssl pkcs12 -in privatekey.pfx -out certificates.cer -nodes
вычленить приватный ключ в текстовом виде в файл your-domain-name_ru.key, включая строки Begin и End.
- Выполнить команду «openssl pkcs12 -export -out your-domain-name_ru.pfx -inkey your-domain-name_ru.key -in your-domain-name_ru.crt», где your-domain-name_ru.pfx — результирующий ключ для IIS (будет создан новый файл), your-domain-name_ru.key приватный ключ, your-domain-name_ru.crt сертификат полученный из zip файла
- Импортировать pfx файл в IIS, обязательно поставить галку разрешать экспорт сертификатов
- Выполнить привязку импортированного сертификата к сайту (ветка Сайты — <Нужный сайт> справа в окне действий Привязки).
Решение проблемы с почтовым доступом 1C на Яндекс или Google
https://help.yandex.ru/mail/support-old.xml
Для поддержки SSL установите дополнительно программу Stunnel:
- Скачайте файл по ссылке:
- версия для 32-разрядной ОС
- версия для 64-разрядной ОС
- Адрес проекта
- Распакуйте архив.
- Запустите файл mailssl.bat от имени администратора .
- В настройках почтовой программы выключите SSL и укажите следующие параметры серверов:
- SMTP: сервер — localhost, порт — 25
- POP3: сервер — localhost, порт — 110
- IMAP: сервер — localhost, порт — 143
Если проблема остается, попробуйте использовать рекомендации из статей Почтовый клиент Управления торговлей и gmail (выполняя рекомендации, везде подставьте вместо gmail значение yandex) и Отправка писем и получение электронной почты с использованием SSL.
Перенос профиля пользователя сервера предприятия 1С USR1CV8 на Ramdrive.
- Следует загасить сервер приложений 1С.
- Зайти на сервер под администратором
- Открываем реестр regedit и идем по пути HKEY_LOCAL_MACHINE/SOFTWARE/MICROSOFT/WINDOWS NT/CURENT VERSION/PROFILELIST
- Ищем папку с настройками данного пользователя, и находим параметр ProfileImagePath который содержит текущий полный путь к профилю пользователя
- Изменяем этот стандарный путь на нужный (куда перенесли учетную запись)
- Из папки C:/USERS можно удалить папку пользователя (если она была скопирована)
- Выставляем необходимые права на папку на Ramdrive
- Сервер 1С можно запустить.
Регистрация проблем в журнале регистрации связанных с отсутствием прав на объекты у пользователей
&НаСервереБезКонтекста
Процедура УстановитьНаСервере()
ОписанияОтказВДоступе=Новый Массив;
ОтказВДоступе =
Новый ОписаниеИспользованияСобытияОтказВДоступеЖурналаРегистрации;
ОписанияОтказВДоступе.Добавить(ОтказВДоступе);
ИспользованиеСобытия = Новый ИспользованиеСобытияЖурналаРегистрации;
ИспользованиеСобытия.Использование = Истина;
ИспользованиеСобытия.ОписаниеИспользования = ОписанияОтказВДоступе;
УстановитьИспользованиеСобытияЖурналаРегистрации(
«_$Access$_.AccessDenied»,
ИспользованиеСобытия);
КонецПроцедуры
Перезагрузка сервера 1С с очисткой кэша сервера из под учетной записи сисадмина
@echo off
net stop «1C:Enterprise 8.3 Server Agent» ‘остановка сервера
copy /y J:srvinforeg_15411CV8Clst.LST C: ‘резервное копирование настроек кластера
rmdir J:srvinforeg_1541 /s /q ‘удаление каталога с кэшем, журналом регистрации и полнотекстовым индексом
md J:srvinforeg_1541 ‘создание пустого каталога
copy C:1CV8Clst.LST J:srvinforeg_1541 ‘копирование настроек кластера
net start «1C:Enterprise 8.3 Server Agent» ‘запуск сервера
Неожиданно стала появляться ошибка Uncaught error 404.13 на IIS 7.5
Может помочь обработка очистки настроек пользователей встроенная в БСП
СКД: Программная установка отбора данных
ЭлементОтбора=КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЭлементОтбора.ВидСравнения=ВидСравненияКомпоновкиДанных.ВИерархии;
ЭлементОтбора.ЛевоеЗначение=Новый ПолеКомпоновкиДанных(«УчастокОбращенияТПС»);//поле отбора
ЭлементОтбора.ПравоеЗначение=РезультатЗапроса.УчастокОбращенияТПС;
ЭлементОтбора.Использование=Истина;
ЭлементОтбора.ИдентификаторПользовательскойНастройки=Новый УникальныйИдентификатор();//добавляет отбор в состав пользовательских настроек
Обслуживание MS SQL сервера
https://ola.hallengren.com/
В одном месте собраны скрипты для оптимизации индексов, обновление статистики, создание резервных копий и проверки физической целостности. Microsoft одобряет.
Запуск консольной программы с получением результата ее работы
ИмяФайлаРаспознования=ПолучитьИмяВременногоФайла(«txt»);
СтрокаЗапуска=»cmd /c zbarimg.exe -q -Sdisable -Sean13.enable «»»+ПутьФайлаКартинки+»»» > «»»+ИмяФайлаРаспознования+»»»»;
КодВозврата=0;
ЗапуститьПриложение(СтрокаЗапуска,ПутьКПрограммеРаспознованияШтрихкода,Истина,КодВозврата);
Если КодВозврата<>0 Тогда
Возврат «»;
КонецЕсли;
ТекстовыйДокумент=Новый ЧтениеТекста(ИмяФайлаРаспознования);
СтрокаВозврата=ВРег(СокрЛП(ТекстовыйДокумент.Прочитать()));
ТекстовыйДокумент.Закрыть();
УдалитьФайл(ИмяФайлаРаспознования);
Как организовать ожидание на сервере на заданное количество секунд.
// Процедура — Ожидание
//
// Параметры:
// Длительность — Число — длительность ожидания в секундах.
//
Процедура Ожидание(Длительность) Экспорт
Идентификатор = Новый УникальныйИдентификатор;
НачатьТранзакцию();
Блокировка = Новый БлокировкаДанных;
Элемент = Блокировка.Добавить(«РегистрСведений.сшпБлокировкаОчереди»);
Элемент.Режим = РежимБлокировкиДанных.Исключительный;
Элемент.УстановитьЗначение(«Идентификатор», Идентификатор);
Блокировка.Заблокировать();
мсвПараметров = Новый Массив;
мсвПараметров.Добавить(Идентификатор);
Задание = ФоновыеЗадания.Выполнить(«сшпОбщегоНазначения.ВыполнитьПаузу», мсвПараметров,, «Выполнить паузу «+Длительность+» сек.»);
Попытка
Задание.ОжидатьЗавершения(Длительность);
Исключение
КонецПопытки;
ОтменитьТранзакцию();
КонецПроцедуры
// Процедура — Выполнить паузу
//
// Параметры:
// Идентификатор — УникальныйИдентификатор — идентификатор сессии ожидания.
//
Процедура ВыполнитьПаузу(Идентификатор) Экспорт
НачатьТранзакцию();
Блокировка = Новый БлокировкаДанных;
Элемент = Блокировка.Добавить(«РегистрСведений.сшпБлокировкаОчереди»);
Элемент.Режим = РежимБлокировкиДанных.Исключительный;
Элемент.УстановитьЗначение(«Идентификатор», Идентификатор);
Попытка
Блокировка.Заблокировать();
Исключение
КонецПопытки;
ОтменитьТранзакцию();
КонецПроцедуры
Еще вариант:
Задержка=0.5;
СтрокаЗапроса = «ping -n 1 -w «+Формат(1000*Задержка, «ЧГ=0″) +» 127.255.255.255″;
WshShell = Новый COMОбъект(«WScript.Shell»);
WshShell.Run(СтрокаЗапроса, 0, -1);
Еще вариант, но пауза кратная секунде:
scr = Новый COMОбъект(«WScript.Shell»);
ПаузаСекунд=10;
scr.Run(«Timeout «+Формат(ПаузаСекунд, «ЧГ=0»),0,1);
Утечка памяти в платформе версии <=8.3.7
Не рекомендуется использовать объекта «СхемаЗапроса» в обработках проведения документов или в циклическом создании запросов. Это может приводить к утечкам памяти на сервере. В качестве обхода рекомендуется стандартная компоновка запроса в виде строки.
https://partners.v8.1c.ru/forum/t/1451154/m/1464424
В 8.3.8 ошибка с утечкой в схеме запроса поправлена: https://bugboard.v8.1c.ru/error/000011424.html
В 8.3.6 есть проблемы со скоростью при получении пакетов запроса из схемы. В 8.3.7 это поправлено.
Принудительная эмуляция IE 11 в 1С для корректного отображения современных страниц интернета
1. Устанавливаем Internet Explorer 11 (Если не установлен)
2. Идем в реестр: HKCUSoftwareMicrosoftInternet ExplorerMainFeatureControlFEATUR E_BROWSER_EMULATION
3. Добавляем 1cv8.exe — REG_DWORD — 11001
Недостаточная производительность конфигуратора на сервере
Самой частой проблемой с конфигуратором на «топовом железе» является включенный DFSS (если работа ведется в терминальной сессии).
Для отключения необходимо внести изменения в ветку реестра:
HKLM_SYSTEMCurrentControlSetControlSession ManagerQuota System
установить параметр EnableCpuQuota = 0.
HKLM_SYSTEMCurrentControlSetControlServicesTSFairShareDisk
установить параметр EnableFairShare = 0.
Рекомендуем проверить настройку управления питанием. Должна быть установлена в «Высокая производительность». Также, необходимо убедиться, что в BIOS отключены настройки балансировки энергопотребления процессором.
Решение проблемы открытия внешних ссылок на объекты 1С
Нужно в реестре прописать связь протокола «e1c» и стартера 1С. Пример для 32-битной системы с установкой 1С в стандартный каталог. Для 64-битной использовать путь “Program Files x86 ”
modify.reg:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOTe1c]
@=»URL:1С Protocol»
«URL Protocol»=»»
[HKEY_CLASSES_ROOTe1cDefaultIcon]
@=»c:\Program Files\1cv8\common\1cestart.exe,0″
[HKEY_CLASSES_ROOTe1cshell]
[HKEY_CLASSES_ROOTe1cshellopen]
[HKEY_CLASSES_ROOTe1cshellopencommand]
@=»»C:\Program Files\1cv8\common\1cestart.exe» /URL «%1″»
СКД: Как получить корректную сумму ресурса у задвоенных записей. Использование новых агрегатных функций. Доступно с 14 релиза 8.2.
Предположим клиент хочет видеть в отчете табличную часть документа и отдельной колонкой сумму всего документа. Тут проблемы нету: соединяем две таблицы и вперед. Проблема возникает когда надо получить итоги в отчете. Стандартная функция СУММА – будет возвращать сумму всех записей по колонке, соответственно сумма документа будет умножена на количество строк в табличной части. Для того чтобы избежать этого можно воспользоваться новыми агрегатными функциями, их было добавлено достаточно много, но нам понадобится функции ТаблицаЗначений, Массив и Сумма. Итак:
ТаблицаЗначений – формирует таблицу значений (из колонок которые содержатся в итоговой таблицы после того как отработал процессор компоновки.
МАССИВ – формирует массив записей от группировок или берет 1-ую колонку таблицы значений
Для решения проблемы в выражении вычислении итогового ресурса суммы всех документов (Вкладка Ресурсы, поле Выражение) запишем:
Сумма(МАССИВ ( ТаблицаЗначений( Различные СуммаДокумента, Ссылка)))
,где: Ссылка – колонка ссылок на документ, а СуммаДокумента – это его сумма.
Программное создание реквизитов формы на примере Таблицы значений
//удаляем старые реквизиты
УдаленныеРеквизиты=Новый Массив;
Для каждого ЭтотРеквизит Из ПолучитьРеквизиты() Цикл
Если ЭтотРеквизит.Имя=»СторноТаблица» Или ЭтотРеквизит.Имя=»ДанныеТаблица» Тогда
УдаленныеРеквизиты.Добавить(ЭтотРеквизит.Имя);
Попытка
ЭтотЭлемент=Элементы[ЭтотРеквизит.Имя];
Если ЭтотЭлемент<>Неопределено Тогда
Элементы.Удалить(ЭтотЭлемент);
КонецЕсли;
Исключение
КонецПопытки;
КонецЕсли;
КонецЦикла;
ИзменитьРеквизиты(,УдаленныеРеквизиты);
//добавляем таблицы на форму
//РезультатТаблица — таблица значений — результат запроса
СоздатьТаблицуНаФорме(«СторноТаблица»,Элементы.ГруппаФормыСторно,РезультатТаблица,Истина);
СоздатьТаблицуНаФорме(«ДанныеТаблица»,Элементы.ГруппаФормыДанные,РезультатТаблица,Ложь);
&НаСервере
Процедура СоздатьТаблицуНаФорме(ИмяТаблицы,ГруппаРодитель,РезультатТаблица,ТолькоПросмотр)
//Создаем таблицу
ДобавленныеРеквизиты=Новый Массив;
ДобавленныеРеквизиты.Добавить(Новый РеквизитФормы(ИмяТаблицы,Новый ОписаниеТипов(«ТаблицаЗначений»),,,Истина));
Для каждого Колонка Из РезультатТаблица.Колонки Цикл
ДобавленныеРеквизиты.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения,ИмяТаблицы));
КонецЦикла;
ИзменитьРеквизиты(ДобавленныеРеквизиты);
//добавляем элементы формы
ТипЧисло=Тип(«Число»);
ТаблицаЭлемент = Элементы.Добавить(ИмяТаблицы, Тип(«ТаблицаФормы»),ГруппаРодитель);
ТаблицаЭлемент.ПутьКДанным = ИмяТаблицы;
ТаблицаЭлемент.Отображение = ОтображениеТаблицы.Список;
ТаблицаЭлемент.ТолькоПросмотр=ТолькоПросмотр;
Для Итератор=0 По 1 Цикл
Для каждого Колонка Из РезультатТаблица.Колонки Цикл
Если Итератор=0 Тогда//числа вконец
Если Колонка.ТипЗначения.СодержитТип(ТипЧисло) Тогда
Продолжить;
КонецЕсли;
Иначе
Если Не Колонка.ТипЗначения.СодержитТип(ТипЧисло) Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
НовыйЭлемент = Элементы.Добавить(ИмяТаблицы+»_»+Колонка.Имя, Тип(«ПолеФормы»), ТаблицаЭлемент);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = ИмяТаблицы+».» + Колонка.Имя;
КонецЦикла;
КонецЦикла;
ЗначениеВРеквизитФормы(РезультатТаблица,ИмяТаблицы);
КонецПроцедуры
Способ с помощью запроса в Management Studio проверить включен ли протокол Shared memory
SELECT host_name, PROGRAM_NAME, net_transport
FROM sys.dm_exec_sessions AS T1
LEFT JOIN sys.dm_exec_connections AS T2
ON T1.session_id=T2.session_id
WHERE T1.program_name LIKE ‘1CV8%’
Простое чтение XML Файла через DOM объект
&НаСервереБезКонтекста
Процедура ЗагрузитьНаСервере()
ЧтениеXML=Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(«<?xml version=»»1.0″»?>
|<catalog>
| <Акции><ID>001</ID><Title>Новая акция</Title><Записи>
| <book id=»»bk101″»>
| <author>Gambardella, Matthew</author>
| <title>XML Developer’s Guide</title>
| <genre>Computer</genre>
| <price>44.95</price>
| <publish_date>2000-10-01</publish_date>
| <description>An in-depth look at creating applications
| with XML.</description>
| </book>
| <book id=»»bk102″»>
| <author>Ralls, Kim</author>
| <title>Midnight Rain</title>
| <genre>Fantasy</genre>
| <price>5.95</price>
| <publish_date>2000-12-16</publish_date>
| <description>A former architect battles corporate zombies,
| an evil sorceress, and her own childhood to become queen
| of the world.</description>
| </book></Записи></Акции>
| <Акции><ID>002</ID><Title>Еще акция</Title><Записи>
| <book id=»»bk112″»>
| <author>Galos, Mike</author>
| <title>Visual Studio 7: A Comprehensive Guide</title>
| <genre>Computer</genre>
| <price>49.95</price>
| <publish_date>2001-04-16</publish_date>
| <description>Microsoft Visual Studio 7 is explored in depth,
| looking at how Visual Basic, Visual C++, C#, and ASP+ are
| integrated into a comprehensive development
| environment.</description>
| </book></Записи></Акции>
| <Акции><ID>003</ID><Title>Нет акций</Title><Записи></Записи></Акции>
|</catalog>»);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
Для каждого элАкции из ДокументDOM.ЭлементДокумента.ДочерниеУзлы Цикл
ID=ПолучитьЗначениеXML(элАкции,»ID»);
Title=ПолучитьЗначениеXML(элАкции,»Title»);
Для каждого элЗаписи из элАкции.ПолучитьЭлементыПоИмени(«Записи») Цикл
Для каждого элКнига из элЗаписи.ДочерниеУзлы Цикл
idbook=элКнига.ПолучитьАтрибут(«id»);
author=ПолучитьЗначениеXML(элЗаписи,»author»);
title_book=ПолучитьЗначениеXML(элЗаписи,»title»);
genre=ПолучитьЗначениеXML(элЗаписи,»genre»);
price=ПолучитьЗначениеXML(элЗаписи,»price»,»Число»);
publish_date=ПолучитьЗначениеXML(элЗаписи,»publish_date»,»Дата»);
description=ПолучитьЗначениеXML(элЗаписи,»description»);
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЗначениеXML(Узел,Ключ,Тип=»Строка»)
Возврат XMLЗначение(Тип(Тип),Узел.ПолучитьЭлементыПоИмени(Ключ)[0].ТекстовоеСодержимое);
КонецФункции
Манипуляция изображениями COM объектом 1С
ИмяВременногоФайла=ПолучитьИмяВременногоФайла(«jpeg»);//jpg
ЭтаКартинка=Новый Картинка(Фото.Получить());
ЭтаКартинка.Записать(ИмяВременногоФайла);
objImageProcess = Новый COMОбъект(«WIA.ImageProcess»);
objImageFile = Новый COMОбъект(«WIA.ImageFile»);
objImageFile.LoadFile(ИмяВременногоФайла);
wiaFormatJPEG = «{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}»;
objImageProcess.Filters.Add(objImageProcess.FilterInfos(«Convert»).FilterID);
objImageProcess.Filters(1).Properties.Item(«FormatID»).Value = wiaFormatJPEG;
objImageProcess.Filters(1).Properties.Item(«Quality»).Value = 51;
objImageFile = objImageProcess.Apply(objImageFile);
objImageFile.SaveFile(ИмяВременногоФайла);
ЭтаКартинка=Новый Картинка(ИмяВременногоФайла);
УдалитьФайлы(ИмяВременногоФайла);
Еще пример (для 64 битных систем следует использовать 64х битные версии компонент):
ИмяВременногоФайла=ПолучитьИмяВременногоФайла(«jpg»);
COMGFLAx = Новый COMОбъект(«GFLAx.GFLAx»); // требуется для формирования превью
ФотоДвоичныеДанные.Получить().Записать(ИмяВременногоФайла);
COMGFLAx.LoadBitmap(ИмяВременногоФайла);
МаксимальнаяШиринаКартинки = 238*1.2;
МаксимальнаяВысотаКартинки = 224*1.2;
// проверим ширину картинки
Ширина=COMGFLAx.Width;
Высота=COMGFLAx.Height;
Если Ширина > МаксимальнаяШиринаКартинки Тогда
COMGFLAx.Resize(МаксимальнаяШиринаКартинки, Цел(Высота*(МаксимальнаяШиринаКартинки/Ширина)));
КонецЕсли;
// проверим высоту картинки
Ширина=COMGFLAx.Width;
Высота=COMGFLAx.Height;
Если Высота > МаксимальнаяВысотаКартинки Тогда
COMGFLAx.Resize(Цел(Ширина*(МаксимальнаяВысотаКартинки/Высота)), МаксимальнаяВысотаКартинки);
КонецЕсли;
COMGFLAx.SaveJPEGQuality = 51;
COMGFLAx.SaveFormat=1;
COMGFLAx.SaveBitmap(ИмяВременногоФайла);
Картинка=Новый Картинка(ИмяВременногоФайла);
УдалитьФайлы(ИмяВременногоФайла);
COMGFLAx = Неопределено;
Список на управляемой форме: Как получить список элементов попадающих под выбранный отбор
ТекущаяСхема=Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
НастройкиОтбора=Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
НастройкиОтбора
.Структура[0].Выбор.Элементы.Очистить();
НовоеПоле = НастройкиОтбора.Структура[0].Выбор.Элементы.Добавить(Тип(«ВыбранноеПолеКомпоновкиДанных»));
НовоеПоле.Использование=Истина;
НовоеПоле.Заголовок = «Ссылка»;
НовоеПоле.Поле=Новый ПолеКомпоновкиДанных(«Ссылка»); //Формируем макет, с помощью компоновщика макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;//Передаем в макет компоновки схему, настройки и данные расшифровки
МакетКомпоновки = КомпоновщикМакета.Выполнить(ТекущаяСхема, НастройкиОтбора,,,Тип(«ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений»));//Выполним компоновку с помощью процессора компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);//Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
РезультатВыборки=ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
СКД: Вывод промежуточного результата таблиц пакетного запроса для отладочных целей с отборами средствами СКД
СхемаЗапроса=Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);//Устанавливаем текст запроса который будет отлаживаться
ВременныеТаблицы=Новый Массив;//Тут фиксируем какие таблицы временные
Для каждого ЭтотПакетЗапросов Из СхемаЗапроса.ПакетЗапросов Цикл
Если Не ПустаяСтрока(ЭтотПакетЗапросов.ТаблицаДляПомещения) Тогда
ВременныеТаблицы.Добавить(Новый Структура(«Имя,Текст»,ЭтотПакетЗапросов.ТаблицаДляПомещения,ЭтотПакетЗапросов.ПолучитьТекстЗапроса()));
КонецЕсли;
КонецЦикла;
РезультатРасчета.Очистить();//Табличный документ в который выводится результат временных таблиц запроса который отлаживается
Для Итератор=0 По ВременныеТаблицы.ВГраница() Цикл
ТекстЗапросаМассив=Новый Массив;
Для ИтераторВременныхТаблиц=0 По Итератор Цикл
ТекстЗапросаМассив.Добавить(ВременныеТаблицы[ИтераторВременныхТаблиц].Текст);
КонецЦикла;
СхемаЗапроса.УстановитьТекстЗапроса(СтрСоединить(ТекстЗапросаМассив,»;»+Символы.ВК));
ПоследнийПакет=СхемаЗапроса.ПакетЗапросов[СхемаЗапроса.ПакетЗапросов.Количество()-1];
ПоследнийПакет.ТаблицаДляПомещения=»»;//в цикла выводим последнюю временную таблицу в результат, поэтому отключаем в запросе сохранение во временную таблицу
//Настройка итоговой схемы для вывода
СхемаДанных=Новый СхемаКомпоновкиДанных;
ИД=СхемаДанных.ИсточникиДанных.Добавить();
ИД.Имя=»ИсточникДанных»;
ИД.ТипИсточникаДанных=»Local»;
//Устанавливаем стандартные настройки схемы для вывода данных в плоскую таблицу ЭтотНабор=СхемаДанных.НаборыДанных.Добавить(Тип(«НаборДанныхЗапросСхемыКомпоновкиДанных»));
ЭтотНабор.АвтоЗаполнениеДоступныхПолей=Истина;
ЭтотНабор.Запрос=СхемаЗапроса.ПолучитьТекстЗапроса();
ЭтотНабор.ИсточникДанных=ИД.Имя;
ЭтотНабор.Имя=ИД.Имя;
Настройки=СхемаДанных.НастройкиПоУмолчанию;
Для каждого ЭтаКолонка Из ПоследнийПакет.Колонки Цикл
ПолеНабора = ЭтотНабор.Поля.Добавить(Тип(«ПолеНабораДанныхСхемыКомпоновкиДанных»));
ПолеНабора.Заголовок = ЭтаКолонка.Псевдоним;
ПолеНабора.Поле = ЭтаКолонка.Псевдоним;
ПолеНабора.ПутьКДанным = ЭтаКолонка.Псевдоним;
ВыбранноеПолеКомпоновкиДанных = Настройки.Выбор.Элементы.Добавить(Тип(«ВыбранноеПолеКомпоновкиДанных»));
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных(ПолеНабора.ПутьКДанным);
ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
КонецЦикла;
ЭтаГруппировка = Настройки.Структура.Добавить(Тип(«ГруппировкаКомпоновкиДанных»));
ЭтаГруппировка.Использование = Истина;
АвтоПоле = ЭтаГруппировка.Выбор.Элементы.Добавить(Тип(«АвтоВыбранноеПолеКомпоновкиДанных»));
АвтоПоле.Использование = Истина;
//Установка неизменяемых параметров для запроса. Индивидуально для каждого запроса
ПараметрДанных=Настройки.ПараметрыДанных.Элементы.Добавить();
ПараметрДанных.Параметр=Новый ПараметрКомпоновкиДанных(«Дата»);
ПараметрДанных.Значение=Объект.Дата;
ПараметрДанных.Использование=Истина;
ПараметрДанных=Настройки.ПараметрыДанных.Элементы.Добавить();
ПараметрДанных.Параметр=Новый ПараметрКомпоновкиДанных(«Ссылка»);
ПараметрДанных.Значение=Объект.Ссылка;
ПараметрДанных.Использование=Истина;
//Настройка параметров вывода
ЗначениеПараметраВывода = Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(«Заголовок»));
ЗначениеПараметраВывода.Значение = ВременныеТаблицы[Итератор].Имя;
ЗначениеПараметраВывода.Использование = Истина;
ЗначениеПараметраВывода = Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(«ВыводитьЗаголовок»));
ЗначениеПараметраВывода.Значение = Истина;
ЗначениеПараметраВывода.Использование = Истина;
//Настройка опциональных пользовательских отборов
НКД=Новый КомпоновщикНастроекКомпоновкиДанных;
АдресСхемы = ПоместитьВоВременноеХранилище(СхемаДанных,ЭтаФорма.УникальныйИдентификатор);
НКД.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
Для каждого ЭтотЭлемент Из КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.Элементы Цикл
Если Неопределено=НКД.Настройки.Отбор.ДоступныеПоляОтбора.НайтиПоле(Новый ПолеКомпоновкиДанных(ЭтотЭлемент.ЛевоеЗначение)) Тогда//Если параметр не найден, то его не нужно устанавливать
Продолжить;
КонецЕсли;
ЭлементОтбора=Настройки.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЗаполнитьЗначенияСвойств(ЭлементОтбора,ЭтотЭлемент);
КонецЦикла;
//формирование результата
//Формируем макет, с помощью компоновщика макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
//Передаем в макет компоновки схему, настройки и данные расшифровки
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаДанных, Настройки);
//Выполним компоновку с помощью процессора компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
//Очищаем поле табличного документа
Результат=Новый ТабличныйДокумент;
//Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
РезультатРасчета.Вывести(Результат);//РезультатРасчета — элемент формы
КонецЦикла;
Прочесть файл EXCEL на сервере в таблицу значений средствами 1С без COM-объекта (с версии 8.3.13)
Работает только в контексте сервера!
Попытка
ТабличныйДокумент.Прочитать(ПолныйПутьКФайлу);//ПолныйПутьКФайлу — адрес xlsx файла на диске кластера 1С
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
//Читаем по страницам EXCEL
Для каждого ЭтаОбласть Из ТабличныйДокумент.Области Цикл
Построитель=Новый ПостроительОтчета;
Построитель.ИсточникДанных=Новый ОписаниеИсточникаДанных(ЭтаОбласть);
Построитель.Выполнить();
ТаблицаЗначений=Построитель.Результат.Выгрузить();
КонецЦикла;
Обход по таблице значений с группировкой по полю аналогично как по результату запроса
ПостроительОтчета=Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных=Новый ОписаниеИсточникаДанных(ТаблицаСтрокЗаказов);
ПостроительОтчета.ИсточникДанных.Колонки.ЗаказКлиента.Измерение = Истина;
ПостроительОтчета.ЗаполнитьНастройки();
ПостроительОтчета.Выполнить();
ВыборкаЗаказКлиента=ПостроительОтчета.Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,«ЗаказКлиента»);
Пока ВыборкаЗаказКлиента.Следующий() Цикл
ВыборкаСтрок=ВыборкаЗаказКлиента.Выбрать();
Пока ВыборкаСтрок.Следующий() Цикл
КонецЦикла;
КонецЦикла;
Запрос: порциональная обработка записей
Разбивка по 100 записей
АктивныеЗаказы = Новый Запрос;
АктивныеЗаказы.Текст = «ВЫБРАТЬ
| …,
| АВТОНОМЕРЗАПИСИ() КАК НомерЗаписи
|ПОМЕСТИТЬ Выборка
|ИЗ
|…;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| …
|ИЗ
| Выборка КАК Выборка
|ИТОГИ ПО |
| ВЫРАЗИТЬ(Выборка.НомерЗаписи / 100 КАК ЧИСЛО(15, 0))»;
РезультатЗапроса=АктивныеЗаказы.Выполнить();
ВыборкаПоГруппировкам = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаПоГруппировкам.Следующий() Цикл
Выборка=ВыборкаПоГруппировкам.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Выборка=ВыборкаПорции.Выбрать();
Пока Выборка.Следующий() Цикл
//Обработка порции
КонецЦикла;
КонецЦикла;