Программное создание, заполнение документа и открытие формы (УП, тонкий клиент) Чтобы программно заполнить документ по кнопке, делаем примерно следующее:
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 УП &НаСервере
Процедура СоздатьТаблицуФормы(Знач ИмяПоляТаблицыФормы, Знач ИмяРеквизитаДанныеФормыКоллекция, Знач ТаблицаЗначений)
// Если руками не создали эелемент формы Таблица, то создается программно
Если Элементы.Найти(ИмяПоляТаблицыФормы) = Неопределено Тогда
ЭлементРеквизита = Элементы.Добавить(ИмяПоляТаблицыФормы, Тип("ТаблицаФормы"),);
ЭлементРеквизита.ПутьКДанным = ИмяРеквизитаДанныеФормыКоллекция;
КонецЕсли;
УдаляемыеРеквизиты = Новый Массив;
РеквизитыДляУдаления = ПолучитьРеквизиты(ИмяРеквизитаДанныеФормыКоллекция);
Для Каждого РеквизитУдаления Из РеквизитыДляУдаления Цикл
УдаляемыеРеквизиты.Добавить(ИмяРеквизитаДанныеФормыКоллекция+"."+РеквизитУдаления.Имя);
// Удаляем элементы формы
Элементы.Удалить(Элементы[ИмяПоляТаблицыФормы+РеквизитУдаления.Имя]);
КонецЦикла;
// Добавление реквизитов в таблицу формы
ДобавляемыеРеквизиты = Новый Массив;
Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ИмяРеквизитаДанныеФормыКоллекция, Колонка.Заголовок));
КонецЦикла;
ИзменитьРеквизиты(ДобавляемыеРеквизиты,УдаляемыеРеквизиты);
// Добавление элементов форму
Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
ЭлементРеквизита = Элементы.Добавить(ИмяПоляТаблицыФормы + Колонка.Имя, Тип("ПолеФормы"), Элементы[ИмяПоляТаблицыФормы]);
ЭлементРеквизита.ПутьКДанным = ИмяРеквизитаДанныеФормыКоллекция + "." + Колонка.Имя;
ЭлементРеквизита.Вид = ВидПоляФормы.ПолеВвода;
КонецЦикла;
ЗначениеВРеквизитФормы(ТаблицаЗначений, ИмяРеквизитаДанныеФормыКоллекция);
КонецПроцедуры
&НаСервере
Процедура ВПоискНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугСерии.Серия КАК Серия,
| РеализацияТоваровУслугСерии.Ссылка КАК Реализация,
| РеализацияТоваровУслугСерии.Ссылка.ЗаказКлиента КАК ЗаказКлиента,
| РеализацияТоваровУслугСерии.Ссылка.Контрагент КАК Контрагент,
| РеализацияТоваровУслугСерии.Ссылка.Договор КАК Договор
|ИЗ
| Документ.РеализацияТоваровУслуг.Серии КАК РеализацияТоваровУслугСерии
|ГДЕ
| РеализацияТоваровУслугСерии.Серия В
| (ВЫБРАТЬ
| СерииНоменклатуры.Ссылка КАК Ссылка
| ИЗ
| Справочник.СерииНоменклатуры КАК СерииНоменклатуры
| ГДЕ
| СерииНоменклатуры.Наименование ПОДОБНОНаименование)
|
|УПОРЯДОЧИТЬ ПО
| Серия
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("Наименование", "%"+НомерФН+"%");
РезультатЗапроса = Запрос.Выполнить();
ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
СоздатьТаблицуФормы("ТЗ","ТЗ",ТаблицаЗапроса);
КонецПроцедуры
&НаКлиенте
Процедура ВПоиск(Команда)
ВПоискНаСервере();
КонецПроцедуры
Категория:
Управляемое приложение, Тонкий клиент Как показать сообщение пользователю? методы: СообщениеПользователю и ПоказатьОповещениеПользователя В 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С фоновых заданий с наименованием "Тестовое задание", так как мы сделали отбор именно по этому наименованию.
Категория:
Регламентные задания, Фоновые задания Преобразование ТаблицыЗначений во временную таблицу Код 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 v 8.х структошибок = Новый СписокЗначений;
//....
// заполнение списка значений
//....
//список значений в массив
Массив=структошибок.ВыгрузитьЗначения();
//Удаляем дубли из массива
ТекущийИндекс = 0;
ВсегоЭлементов = Массив.Количество();
Пока ТекущийИндекс < ВсегоЭлементов Цикл
Индекс2 = ТекущийИндекс + 1;
Пока Индекс2 < ВсегоЭлементов Цикл
Если Массив[Индекс2] = Массив[ТекущийИндекс] Тогда
Массив.Удалить(Индекс2);
ВсегоЭлементов = ВсегоЭлементов - 1;
Иначе
Индекс2 = Индекс2 + 1;
КонецЕсли;
КонецЦикла;
ТекущийИндекс = ТекущийИндекс + 1;
КонецЦикла;
//Выведем результат
Для Каждого спстр из Массив цикл
Сообщить(спстр);
КонецЦикла;
Категория:
Работа с Списком Значений Ввод по строке - поиск по первым символам или в любом месте наименования При разработке конфигурации, для упрощении ввода документов потребовалось настроить ввод номенклатуры по совпадению любой части наименования!
В 1С 8.3 по умолчанию настройки справочника номенклатуры такие:
При такой настройке, механизм поиска в справочнике номенклатуры работает так:
- в справочнике
- в документе вводим первые символы Пета и видим такой результат подсказки:
Но, такой поиск не удобен и менеджеры захотели подбирать номенклатуру по артикулу , например 1320
Для этого изменим настройки указав поиск по Любой части и включив полнотекстовый поиск:
Сохраняем конфигурацию и в режиме предприятие обновляем Полнотекстовый поиск: Меню - Все функции - Стандартные - Управление полнотекстовый поиском
После этого пробуем в документе выполнить поиск по 1320 и видим:
Все Менеджеры пищат как дети на новогодней елке!
Пока писал эту статью нашел в интернете другое решение для платформы 8.2 :
СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>)
ОбработкаПолученияДанныхВыбора (ChoiceDataGetProcessing)
Синтаксис:
ОбработкаПолученияДанныхВыбора(<ДанныеВыбора>, <Параметры>, <СтандартнаяОбработка>)
В модуле менеджера справочника "Номенклатура" пишем:
Код 1C v 8.2 УП Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНОНаименование";
Запрос.УстановитьПараметр("Наименование", "%" + Параметры.СтрокаПоиска + "%");
РезультатЗапроса = Запрос.Выполнить();
Таблица = РезультатЗапроса.Выгрузить();
Массив = Таблица.ВыгрузитьКолонку("Ссылка");
ДанныеВыбора = Новый СписокЗначений;
ДанныеВыбора.ЗагрузитьЗначения(Массив);
СтандартнаяОбработка = Ложь;
КонецПроцедуры
В обработчике - ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбраблтка) для нас важны все три параметра. В первый "ДанныеВыбора" мы загружаем наш список номенклатуры, полученный по нашему алгоритму. Из параметра "Параметры" мы получим значение введенное пользователем, а третьему параметру "СтандартнаяОбработка" мы должны поставить значение "Ложь"(отключаем стандартный алгоритм системы).
В результате одной небольшой процедурой мы полностью решили поставленную задачу.
Категория:
Управляемое приложение, Тонкий клиент Как программно создать нового пользователя или скопировать настройки существующего? Часто встречаю вопросы касаемые программного создания и настройки прав пользователей.
В этот статье я приведу примеры для Обычного и Управляемого приложений, которые программно создают пользователя в конфигураторе и в режиме Предприятие (справочник пользователи) и установку Групп пользователей.
В приложении к статье обработки, код которых приведен ниже: Скачать обработки
Обработки были написаны под УТ, но, при необходимости, вы можете их легко доработать под другие конфигурации.
Управляемое приложение: В конфигурациях на управляемом интерфейсе (Такси) изменили подход к ведению пользователей. Если вы добавляете не программно, то добавлять нужно из режима Предприятия - тогда пользователь ИБ у вас сам создатся. И если раньше, в обычном приложении, достаточно будет добавить польз в конфигураторе - и при заходе в Предприятие, этот польз сам создавался в спр Пользователи, то с управляемым приложением такой фокус не прокатит - система не даст зайти под пользователем ИБ, которого нет в справочнике Пользователи.
! В типовых конфигурациях для работы с пользователями активно используется БСП !
В общем модуле Пользователи используется программный интерфейс процедур и функций НовоеОписаниеПользователяИБ , ПрочитатьПользователяИБ , ЗаписатьПользователяИБ иУдалитьПользователяИБ .
Код создания нового пользователя с использованием БСП:
Код 1C v 8.3 &НаСервере
Функция КопированиеВсехНастроек(ПользовательСсылка,ПользовательПриемник)
Пользователь = Обработки.НастройкиПользователей.ИмяПользователяИБ(ПользовательСсылка);
Приемники = Новый Массив;
ТаблицаПользователей = Новый ТаблицаЗначений;
ТаблицаПользователей.Колонки.Добавить("Пользователь");
ТаблицаПользователей = Обработки.НастройкиПользователей.ПользователиДляКопирования(ПользовательСсылка, ТаблицаПользователей,
ТипЗнч(ПользовательСсылка) = Тип("СправочникСсылка.ВнешниеПользователи"));
Для Каждого СтрокаТаблицы Из ТаблицаПользователей Цикл
Приемники.Добавить(ПользовательПриемник);
КонецЦикла;
КопируемыеНастройки = Новый Массив;
КопируемыеНастройки.Добавить("НастройкиОтчетов");
КопируемыеНастройки.Добавить("НастройкиВнешнегоВида");
КопируемыеНастройки.Добавить("ПерсональныеНастройки");
КопируемыеНастройки.Добавить("Избранное");
КопируемыеНастройки.Добавить("НастройкиПечати");
КопируемыеНастройки.Добавить("ПрочиеПользовательскиеНастройки");
НастройкиСкопированы = Обработки.НастройкиПользователей.
КопированиеНастроекПользователей(ПользовательСсылка, Приемники, КопируемыеНастройки);
Возврат НастройкиСкопированы;
КонецФункции
Функция СоздатьНовыйУровеньДоступа(ФИО)
Рез = Справочники.CRM_УровниДоступа.НайтиПоНаименованию(ФИО);
Если Рез = Неопределено ИЛИ Рез = Справочники.CRM_УровниДоступа.ПустаяСсылка() Тогда
НовыйОбъект = Справочники.CRM_УровниДоступа.СоздатьЭлемент();
НовыйОбъект.Наименование = ФИО;
НовыйОбъект.Записать();
возврат НовыйОбъект.Ссылка;
КонецЕсли;
КонецФункции
Процедура ОбновитьДанныеПользователяИБ(ПользовательНастроек, Знач ОтображатьИмя = Истина)
Если ПользовательНастроек = Неопределено Тогда
Возврат;
КонецЕсли;
ПроверкаНаСуществующегоПользователя = ПользователиИнформационнойБазы.НайтиПоИмени(Объект.ФИОСоздаваемогоПользователя);
Если ПроверкаНаСуществующегоПользователя = Неопределено Тогда
Пользователь_Шаблон = ПользователиИнформационнойБазы.НайтиПоИмени(сокрлп(ПользовательНастроек.Наименование));
ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
ПользовательИБСуществует = Ложь;
ДоступКИнформационнойБазеРазрешен = Ложь;
// Заполнение начальных значений свойств пользователяИБ.
Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Ложь;
Иначе
ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора =
НЕ Константы.ИспользоватьВнешнихПользователей.Получить();
КонецЕсли;
ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;
ОписаниеПользователяИБ.Роли = Новый Массив;
ПрочитанныеСвойства = Неопределено;
Если Пользователи.ПрочитатьПользователяИБ(
ПользовательНастроек.ИдентификаторПользователяИБ,ПрочитанныеСвойства
) Тогда
// Установка связи пользователем ИБ.
//ДоступКИнформационнойБазеРазрешен = Истина;
// Копирование свойств и ролей пользователяИБ.
ЗаполнитьЗначенияСвойств(
ОписаниеПользователяИБ,
ПрочитанныеСвойства,
"АутентификацияOpenID,
|АутентификацияСтандартная,
|ЗапрещеноИзменятьПароль,
|ПоказыватьВСпискеВыбора,
|АутентификацияОС,
|РежимЗапуска,
|Язык,
|Роли");
КонецЕсли;
ОписаниеПользователяИБ.Вставить("Действие", "Записать");
ОписаниеПользователяИБ.Вставить("Имя", Объект.ФИОСоздаваемогоПользователя);
НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент();
НовыйПользователь.Наименование = Объект.ФИОСоздаваемогоПользователя;
НовыйПользователь.ТекущееПодразделение = ПользовательНастроек.ТекущееПодразделение;
НовыйПользователь.CRM_УровеньДоступа = СоздатьНовыйУровеньДоступа(Объект.ФИОСоздаваемогоПользователя);
НовыйПользователь.Недействителен = ложь;
НовыйПользователь.ДополнительныеСвойства.Вставить(
"ОписаниеПользователяИБ", ОписаниеПользователяИБ);
НовыйПользователь.Записать();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ГруппыПользователейПользователиГруппы.Ссылка
|ИЗ
| Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейПользователиГруппы
|ГДЕ
| ГруппыПользователейПользователиГруппы.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыПользователейПользователиГруппы.Ссылка";
Запрос.УстановитьПараметр("Пользователь", ПользовательНастроек);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
объ = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
НоваяСтрока = объ.Состав.Добавить();
НоваяСтрока.Пользователь = НовыйПользователь.Ссылка;
объ.Записать();
КонецЦикла;
Запрос.Текст =
"ВЫБРАТЬ
| ГруппыДоступаПользователи.Ссылка
|ИЗ
| Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
|ГДЕ
| ГруппыДоступаПользователи.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыДоступаПользователи.Ссылка";
Запрос.УстановитьПараметр("Пользователь", ПользовательНастроек);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
объ = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
НоваяСтрока = объ.Пользователи.Добавить();
НоваяСтрока.Пользователь = НовыйПользователь.Ссылка;
объ.Записать();
КонецЦикла;
КопированиеВсехНастроек(ПользовательНастроек,НовыйПользователь.Ссылка);
Иначе
сообщить("Указанное ФИО Пользователя уже используется !!! ");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СоздатьПользователя(Команда)
СоздатьПользователяНаСервере();
КонецПроцедуры
&НаСервере
Процедура СоздатьПользователяНаСервере()
Если НЕ ЗначениеЗаполнено(Объект.ШаблонПользователяДляСозданияНового) Тогда
Возврат;
КонецЕсли;
// настройки устанавливаются на форму
ОбновитьДанныеПользователяИБ(Объект.ШаблонПользователяДляСозданияНового, Ложь);
КонецПроцедуры
&НаСервере
Процедура СкопироватьНастройкиНаСервере(ИзменяемыйПользователь,ШаблонПользователяДляКопирования)
//Копируем роли пользователя
тИзменяемыйПользователь = ПользователиИнформационнойБазы.НайтиПоИмени(сокрлп(ИзменяемыйПользователь.Наименование));
тШаблонПользователяДляКопирования = ПользователиИнформационнойБазы.НайтиПоИмени(сокрлп(ШаблонПользователяДляКопирования.Наименование));
//Очищаем роли
тИзменяемыйПользователь.Роли.Очистить();
// Копируем
СписокДоступныхРолейПользователяИБ = Новый СписокЗначений;
Для Каждого мРоль Из Метаданные.Роли Цикл
СтрокаСписокаДоступныхРолей = СписокДоступныхРолейПользователяИБ.Добавить();
СтрокаСписокаДоступныхРолей.Представление = мРоль.Представление();
СтрокаСписокаДоступныхРолей.Значение = мРоль;
КонецЦикла;
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
Если тШаблонПользователяДляКопирования.Роли.Содержит(СтрокаСпискаДоступныхРолей.Значение) Тогда
тИзменяемыйПользователь.Роли.Добавить(СтрокаСпискаДоступныхРолей.Значение);
КонецЕсли;
КонецЦикла;
тИзменяемыйПользователь.Записать();
//Копируем настройки БСП
КопированиеВсехНастроек(ШаблонПользователяДляКопирования,ИзменяемыйПользователь);
КонецПроцедуры
&НаКлиенте
Процедура СкопироватьНастройки(Команда)
СкопироватьНастройкиНаСервере(Объект.ИзменяемыйПользователь, Объект.ШаблонПользователяДляКопирования);
КонецПроцедуры
Обычное приложение: В обычном все проще:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
Если НЕ ЗначениеЗаполнено(ШаблонПользователяДляСозданияНового) Тогда
Возврат;
КонецЕсли;
// настройки устанавливаются на форму
ОбновитьДанныеПользователяИБ(ШаблонПользователяДляСозданияНового, Ложь);
КонецПроцедуры
Процедура ОбновитьДанныеПользователяИБ(ПользовательНастроек, Знач ОтображатьИмя = Истина)
Если ПользовательНастроек = Неопределено Тогда
Возврат;
КонецЕсли;
ПроверкаНаСуществующегоПользователя = ПользователиИнформационнойБазы.НайтиПоИмени(ФИОСоздаваемогоПользователя);
Если ПроверкаНаСуществующегоПользователя = Неопределено Тогда
Пользователь_Шаблон = ПользователиИнформационнойБазы.НайтиПоИмени(сокрлп(ПользовательНастроек.Код));
ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
ПользовательИБ.Имя = ФИОСоздаваемогоПользователя;
ПользовательИБ.АутентификацияСтандартная = Истина;
ПользовательИБ.Пароль = ПарольСоздаваемогоПользователя;
ПользовательИБ.ПолноеИмя = ФИОСоздаваемогоПользователя;
ПользовательИБ.ПоказыватьВСпискеВыбора = Истина;
ПользовательИБ.ОсновнойИнтерфейс = Пользователь_Шаблон.ОсновнойИнтерфейс;
ПользовательИБ.Язык = Пользователь_Шаблон.Язык;
СписокДоступныхРолейПользователяИБ = Новый СписокЗначений;
Для Каждого мРоль Из Метаданные.Роли Цикл
СтрокаСписокаДоступныхРолей = СписокДоступныхРолейПользователяИБ.Добавить();
СтрокаСписокаДоступныхРолей.Представление = мРоль.Представление();
СтрокаСписокаДоступныхРолей.Значение = мРоль;
КонецЦикла;
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
Если Пользователь_Шаблон.Роли.Содержит(СтрокаСпискаДоступныхРолей.Значение) Тогда
ПользовательИБ.Роли.Добавить(СтрокаСпискаДоступныхРолей.Значение);
КонецЕсли;
КонецЦикла;
ПользовательИБ.Записать();
НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент();
//НовыйПользователь.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор;
НовыйПользователь.Код = ФИОСоздаваемогоПользователя;
НовыйПользователь.Наименование = ФИОСоздаваемогоПользователя;
НовыйПользователь.Родитель = ПользовательНастроек.Родитель;
НовыйПользователь.Подразделение = ПользовательНастроек.Подразделение;
НовыйПользователь.Категория = ПользовательНастроек.Категория;
НовыйПользователь.Руководитель = ПользовательНастроек.Руководитель;
НовыйПользователь.Действует = ПользовательНастроек.Действует;
НовыйПользователь.Записать();
НаборПользователя = РегистрыСведений.НастройкиПользователей.СоздатьНаборЗаписей();
НаборПользователя.Отбор.Пользователь.Установить(ПользовательНастроек);
НаборПользователя.Прочитать();
НаборНовогоПользователя = РегистрыСведений.НастройкиПользователей.СоздатьНаборЗаписей();
НаборНовогоПользователя.Отбор.Пользователь.Установить(НовыйПользователь.Ссылка);
Для Каждого СтрокаНастроек из НаборПользователя Цикл
НоваяСтрокаНастроек = НаборНовогоПользователя.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрокаНастроек,СтрокаНастроек);
НоваяСтрокаНастроек.Пользователь = НовыйПользователь.Ссылка;
Если Найти(СтрокаНастроек.Настройка.Наименование,"Основной ответственный") Тогда
НоваяСтрокаНастроек.Значение = НовыйПользователь.Ссылка;
КонецЕсли;
КонецЦикла;
Если НаборНовогоПользователя.Количество()>0 Тогда
НаборНовогоПользователя.Записать();
КонецЕсли;
сообщить("Создан пользователь "+ФИОСоздаваемогоПользователя);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ГруппыПользователейПользователиГруппы.Ссылка
|ИЗ
| Справочник.ГруппыПользователей.ПользователиГруппы КАК ГруппыПользователейПользователиГруппы
|ГДЕ
| ГруппыПользователейПользователиГруппы.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыПользователейПользователиГруппы.Ссылка";
Запрос.УстановитьПараметр("Пользователь", ПользовательНастроек);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
объ = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
НоваяСтрока = объ.ПользователиГруппы.Добавить();
НоваяСтрока.Пользователь = НовыйПользователь.Ссылка;
объ.Записать();
КонецЦикла;
Иначе
сообщить("Указанное ФИО Пользователя уже используется !!! ");
КонецЕсли;
КонецПроцедуры
еще пример:
Код 1C v 8.х Функция ДобавитьПользователя(ИмяПользователя, ДоменноеИмя, ПользовательАктивен, АутентификацияОС, Авторизация1СПредприятия, МассивРолей) Экспорт
// Попробуем найти сотрудника
Пользователь = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
// Теперь попробум найти сотрудника по пользователю ос
Если Пользователь = Неопределено Тогда
Для Каждого ТекущийПользователь Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
Если ТекущийПользователь.ПользовательОС = ДоменноеИмя Тогда
Пользователь = ТекущийПользователь;
Прервать;
Конецесли;
КонецЦикла;
КонецЕсли;
//
// Если мы не нашли сотрудника, то создадим его
Если Пользователь = Неопределено Тогда
Пользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
КонецЕсли;
//
// Записываем свойства
Пользователь.АутентификацияОС = АутентификацияОС;
Пользователь.АутентификацияСтандартная = Авторизация1СПредприятия;
Пользователь.ЗапрещеноИзменятьПароль = Истина;
Пользователь.Имя = ИмяПользователя;
Пользователь.ПолноеИмя = ИмяПользователя;
Пользователь.ПоказыватьВСпискеВыбора = Ложь;
Пользователь.ПользовательОС = ДоменноеИмя;
// Сначала очистим все текущие роли
Пользователь.Роли.Очистить();
// Теперь найдем переданный массив ролей в справочнике профилей
// и добавим все роли указанные в профиле. Все очень сложно, да
МассивИменРолей = Новый Массив();
Для Каждого Роль Из МассивРолей.Role Цикл
МассивИменРолей.Добавить(Роль);
КонецЦикла;
ТекстЗапроса = "ВЫБРАТЬ
| ПрофилиГруппДоступаРоли.Роль.Имя КАК Имя
|ИЗ
| Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
|ГДЕ
| ПрофилиГруппДоступаРоли.Ссылка.Наименование В(&МассивИменРолей)";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("МассивИменРолей", МассивИменРолей);
Результат = Запрос.Выполнить().Выгрузить();
Для Каждого Роль Из Результат Цикл
НайденнаяРоль = Метаданные.Роли.Найти(Роль.Имя);
Если НайденнаяРоль <> Неопределено Тогда
Пользователь.Роли.Добавить(НайденнаяРоль);
КонецЕсли;
КонецЦикла;
// Записываем!
Пользователь.Записать();
// Теперь посмотрим нужно ли деактивировать пользователя
Если Не ПользовательАктивен Тогда
ДективироватьПользователя(Пользователь);
КонецЕсли;
// Запишем еще и справочник пользователя
ЗаполнитьСправочникПользователя(Пользователь);
Возврат Истина;
КонецФункции
// Процедура заполняет помимо прочего справочник пользователя
Процедура ЗаполнитьСправочникПользователя(ПользовательИБ) Экспорт
ТекстЗапроса = "ВЫБРАТЬ
| ИСТИНА КАК ЕстьПользователь,
| Пользователи.Ссылка КАК Пользователь
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.ИдентификаторПользователяИБ =ИдентификаторПользователяИБ
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЛОЖЬ,
| NULL";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор);
Результат = Запрос.Выполнить().Выгрузить()[0];
ОписаниеПользователя = Пользователи.НовоеОписаниеПользователяИБ();
Если Результат.ЕстьПользователь Тогда
ПользовательОбъект = Результат.Пользователь.ПолучитьОбъект();
Иначе
ПользовательОбъект = Справочники.Пользователи.СоздатьЭлемент();
ПользовательОбъект.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор;
ПользовательОбъект.Наименование = ПользовательИБ.Имя;
ОписаниеПользователя.Вставить("Действие", "Записать");
ПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователя);
КонецЕсли;
ЗаполнитьЗначенияСвойств(ОписаниеПользователя, ПользовательИБ);
Для Каждого Элемент Из ОписаниеПользователя Цикл
ПользовательОбъект.ДополнительныеСвойства.Вставить(Элемент.Ключ, Элемент.Значение);
КонецЦикла;
ПользовательОбъект.ДополнительныеСвойства.Удалить("Роли");
ПользовательОбъект.Записать();
КонецПроцедуры
Категория:
Пользователь, роль доступа, интерфейс Как узнать кто изменил документ в 1С (Журнал регистрации действий пользователей)? В процессе работы предприятия нередко возникает необходимость узнать кто, когда и что именно изменял в документе или справочнике программы.
Очень часто мне задают вопросы:
Как в 1С 8.2 посмотреть поменявшего документ? Как в 1с посмотреть изменившего документ? Как в 1С узнать кто и когда изменял документы? Как в 1С узнать кто изменил проводку в документе? Как посмотреть кто изменял документ в 1с? Журнал регистрации Содержит информацию о том, какие события происходили в информационной базе в определенный момент времени или какие действия выполнял тот или иной пользователь. Для каждой записи журнала, отражающей изменение данных, отображается статус завершения транзакции (транзакция завершена успешно, или же транзакция отменена).
Журнал регистрации доступен как в режиме 1С:Предприятие, так и в режиме Конфигуратор. Доступ к журналу регистрации возможен как из режима Конфигуратора (через меню Администрирование - Журнал регистрации ), так и из режима Предприятия (меню Сервис - Журнал регистрации ). В режиме Такси (Основное меню - Все функции - Стандартные - Журнал регистрации )
Вид журнала регистрации (Обычные формы и Такси):
Отбор в журнале регистрации (Обычные формы и Такси):
Используя средства работы со списками имеется возможность выгрузить журнал регистрации в табличный или, при необходимости, текстовый документ (через Действия - Вывести список) , который в дальнейшем может быть сохранен например в формате Excel , TXT или HTML. При этом существует возможность настройки уровня событий, которые будут фиксироваться в журнале регистрации, а также периодичности разделения журнала на отдельные файлы (в режиме конфигуратора меню Администрирование - Настройка журнала регистрации ).
И там же есть возможность сократить количество записей данного журнала до определенной даты, что делается для ускорения работы с механизмом анализа и регистрации событий в системе или за ненадобностью неактуальной информации.
Где хранится журнал регистрации В Файловой базе: в каталоге базы папка 1Cv8Log - это и есть директория содержащая журнал регистрации.
Если вы планируете перенести файловую базу данных и хотите сохранить историю журнала регистрации & вам обязательно надо скопировать папку 1Cv8Log в категорию новой базы 1С. Если необходимо очистить журнал регистрации 1С в файловой базе просто удалите папку 1Cv8Log.
В Клиент-серверной базе: C:\Program Files\1cv8\srvinfo\<Имя кластера сервера>\<Идентификатор базы на сервере>\1Cv8Log
С версии 8.3.5.1068 . Значительно переработали журнал регистрации для того, чтобы увеличить скорость выполнения запросов к журналу и повысить надёжность хранения данных.
Для этого, в том числе, потребовалось изменить формат хранения журнала регистрации. Теперь он хранится в одном файле базы данных SQLite. Этот файл имеет расширение lgd.
Версионирование объектов В некоторых конфигурациях 1С внедрен специальный механизм «Версионирование объектов».
По умолчанию версионирование выключено, чтобы включить откройте Сервис - Настройки учета - Настройка параметров учета
По кнопке «Настройка версионирования объектов» выбираем, какие справочники и документы нужно версионировать (наблюдать за тем, кто, что и когда изменил).
По умолчанию наблюдение за объектами информационной базы не ведется, поетому напротив каждого типа документов установлен признак «Не версионировать». Если нужно чтоб наблюдение велось, нужно установить «Версионировать» напротив интересующего журнала документов.
Все, при закрытии окна и нажатии на кнопку «Оk» наблюдение за объектами будет вестись.
Для того чтоб просмотреть все изменения которые кто-то делал в документе или справочнике нужно перейти в меню: Сервис - История изменений объектов
Категория:
Администрирование