В постах автор приводит вырезки из кода, поэтому Copy-Paste в 1С:Конфигуратор не всегда работает. Предварительно надо определить необходимые переменные и т.д.

Данные посты сделаны в виде заметок, они охватывают моменты, которые, по моему мнению, слабо описаны в документации и вызвали некоторую потерю времени на поиски.

Управляемые Формы:

Дополнительные преобразования:

Типы данных Управляемой формы:

Сохранение/восстановление переменной в форме документа пользователя

&НаСервере

Процедура СохрНастр(имя,зн)

    УстановитьПривилегированныйРежим(Истина);

    ХранилищеОбщихНастроек.Сохранить("РасходнаяНакладная",

            имя,

            зн,

            ,

            Строка(ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор) );

    УстановитьПривилегированныйРежим(Ложь);

КонецПроцедуры

&НаСервере

Функция ВостНаст(имя)

    УстановитьПривилегированныйРежим(Истина);

    зн = ХранилищеОбщихНастроек.Загрузить("РасходнаяНакладная",

            Имя,

            ,

            Строка(ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор) );

    УстановитьПривилегированныйРежим(Ложь);

    Возврат зн;

КонецФункции

&НаКлиенте

Процедура сохр(Команда)

    СохрНастр("Имя1",123);

    Сообщить(ВостНаст("Имя1"));

КонецПроцедуры

Документ Сторнирование (идея взята из УПП 1.3)

Создать документ Сторнирование по записям в любом регистре и любого документа. Данный пример сторнирует регистры Накопления.

1.Создать Документы.Сторнирование:

Движения -> Проведение = Запрещено;

Добавить сторнируемые регистры; Данные -> Сторнируемый Документ.

2.Код в МодулеОбъекта:

Функция ПринКлассуМД(Класс,Объект)

    Для каждого мдОб Из Метаданные[Класс] Цикл

        Если мдОб = Объект Тогда

            Возврат Истина;

        КонецЕсли;

    КонецЦикла;

    Возврат Ложь;

КонецФункции

Процедура ЗаполнитьЗаписьСторно(дв, сДВ, рег)

    Для каждого мдОб Из рег.Измерения Цикл

        дв[мдОб.Имя] = сДВ[мдОб.Имя];

    КонецЦикла;

    Для каждого мдОб Из рег.Ресурсы Цикл

        дв[мдОб.Имя] = -сДВ[мдОб.Имя];

    КонецЦикла;

    Для каждого мдОб Из рег.Реквизиты Цикл

        дв[мдОб.Имя] = сДВ[мдОб.Имя];

    КонецЦикла;

КонецПроцедуры

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

    Запрос = Новый Запрос;

    Запрос.Текст =

        "ВЫБРАТЬ

        |    СторнируемыйДокумент.Ссылка

        |ИЗ

        |    Документ."+СторнируемыйДокумент.Метаданные().Имя+" КАК СторнируемыйДокумент

        |ГДЕ

        |    СторнируемыйДокумент.Ссылка = &Ссылка

        |    И СторнируемыйДокумент.МоментВремени < &МоментВремени";

    Запрос.УстановитьПараметр("МоментВремени", МоментВремени());

    Запрос.УстановитьПараметр("Ссылка", СторнируемыйДокумент);

    Если Запрос.Выполнить().Пустой() Тогда

        Сообщение = Новый СообщениеПользователю;

        Сообщение.Текст = "Несторнируемый документ!";

        Сообщение.Сообщить();

        отказ = Истина;

        Возврат;

    КонецЕсли;

   

    Для каждого сРег Из СторнируемыйДокумент.Метаданные().Движения Цикл

        Если Не Метаданные().Движения.Содержит(сРег) Тогда

            Продолжить;

        КонецЕсли;

       

        этоРР = Ложь; этоРН = Ложь;    этоРБ = Ложь;

       

        Если ПринКлассуМД("РегистрыРасчета",сРег) Тогда

            этоРР = Истина;

            нз = РегистрыРасчета[сРег.Имя].СоздатьНаборЗаписей();

        ИначеЕсли ПринКлассуМД("РегистрыНакопления",сРег) Тогда

            этоРН = Истина;

            нз = РегистрыНакопления[сРег.Имя].СоздатьНаборЗаписей();

        ИначеЕсли ПринКлассуМД("РегистрыБухгалтерии",сРег) Тогда

            этоРБ = Истина;

            нз = РегистрыБухгалтерии[сРег.Имя].СоздатьНаборЗаписей();

        КонецЕсли;

       

        нз.Отбор.Регистратор.Значение = СторнируемыйДокумент;

        нз.Прочитать();

       

        Для каждого сДВ Из нз Цикл

            дв = Движения[сРег.Имя].Добавить();

            ЗаполнитьЗаписьСторно(дв,сДВ,сРег);

            Если этоРН Тогда

                дв.Период = Дата;

                Если сРег.ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки Тогда

                    дв.ВидДвижения = сДВ.ВидДвижения;

                КонецЕсли;

            КонецЕсли;

        КонецЦикла;

    КонецЦикла;

КонецПроцедуры

Запись в РегистрСведений

Записать одну запись в РегистрСведений.Штрихкоды Конфигурация УТ 10.3

1-й Способ

зап = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();

2-й Способ

нб = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();

нб.Отбор.Штрихкод.Установить(шк);

нб.Отбор.Владелец.Установить(нмСсылка);

нб.Отбор.ЕдиницаИзмерения.Установить(еиСсылка);

нб.Отбор.ТипШтрихкода.Установить(вшкСсылка);

нб.Отбор.Качество.Установить(качествоТовара);

зап = нб.Добавить();

Далее общий код:

зап.Штрихкод = шк;

зап.Владелец = нмСсылка;

зап.ЕдиницаИзмерения = еиСсылка;

зап.ТипШтрихкода = вшкСсылка;

зап.Качество = качествоТовара;

зап.ПредставлениеШтрихкода = шк;

Попытка

     зап.Записать();

Исключение

КонецПопытки;

Easy OS Tricks & Programs

Встроенная система печати в Управлении Торговлей 11

Задача:

Создать и зарегистрировать внешний отчет

Решение:

Функция СведенияОВнешнейОбработке() Экспорт - передает описание, привязки к дереву метаданных, создает комманду для вызова

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт - точка входа

Функция СформироватьПечатнуюФормуИмяОбработки(МассивОбъектов, ОбъектыПечати) - заполнение ТабличныйДокумент


// Интерфейс для регистрации обработки.

// Вызывается при добавлении обработки в справочник "ВнешниеОбработки"

//

// Возвращаемое значение:

// Структура:

// Вид - строка - возможные значения: "ДополнительнаяОбработка"

// "ДополнительныйОтчет"

// "ЗаполнениеОбъекта"

// "Отчет"

// "ПечатнаяФорма"

// "СозданиеСвязанныхОбъектов"

//

// Назначение - массив строк имен объектов метаданных в формате:

// <ИмяКлассаОбъектаМетаданного>.[ * | <ИмяОбъектаМетаданных>]

// Например, "Документ.СчетЗаказ" или "Справочник.*"

// Прим. параметр имеет смысл только для назначаемых обработок

//

// Наименование - строка - наименование обработки, которым будет заполнено

// наименование справочника по умолчанию - краткая строка для

// идентификации обработки администратором

//

// Версия - строка - версия обработки в формате <старший номер>.<младший номер>

// используется при загрузке обработок в информационную базу

// БезопасныйРежим – Булево – Если истина, обработка будет запущена в безопасном режиме.

// Более подбробная информация в справке.

//

// Информация - Строка- краткая информация по обработке, описание обработки

//

// Команды - ТаблицаЗначений - команды, поставляемые обработкой, одная строка таблицы соотвествует

// одной команде

// колонки:

// - Представление - строка - представление команды конечному пользователю

// - Идентификатор - строка - идентефикатор команды. В случае печатных форм

// перечисление через запятую списка макетов

// - Использование - строка - варианты запуска обработки:

// "ОткрытиеФормы" - открыть форму обработки

// "ВызовКлиентскогоМетода" - вызов клиентского экспортного метода из формы обработки

// "ВызовСерверногоМетода" - вызов серверного экспортного метода из модуля объекта обработки

// - ПоказыватьОповещение – Булево – если Истина, требуется оказывать оповещение при начале

// и при окончании запуска обработки. Прим. Имеет смысл только

// при запуске обработки без открытия формы.

// - Модификатор – строка - для печатных форм MXL, которые требуется

// отображать в форме ПечатьДокументов подсистемы Печать

// требуется установить как "ПечатьMXL"

//

Функция СведенияОВнешнейОбработке() Экспорт

ПараметрыРегистрации = Новый Структура;

ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");

ПараметрыРегистрации.Вставить("Назначение", ПолучитьНазначениеОбработки());

ПараметрыРегистрации.Вставить("Наименование", НСтр("ru = 'Печатная форма: Имя Обработки'"));

ПараметрыРегистрации.Вставить("Версия", "1.0");

ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);

ПараметрыРегистрации.Вставить("Информация", НСтр("ru = 'Обработка формирования печатной формы: ""ИмяОбработки""'"));

ТаблицаКоманд = ПолучитьТаблицуКоманд();

ДобавитьКоманду( ТаблицаКоманд, НСтр("ru = 'Имя Обработки''"), "ИмяОбработки", "ВызовСерверногоМетода",

Истина, "ПечатьMXL");

ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

Возврат ПараметрыРегистрации;

КонецФункции

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;

Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ИмяОбработки") Тогда

УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(

КоллекцияПечатныхФорм,

"ИмяОбработки",

"ИмяОбработки",

СформироватьПечатнуюФормуИмяОбработки(МассивОбъектов, ОбъектыПечати) );

КонецЕсли;

КонецПроцедуры

// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

Функция ПолучитьНазначениеОбработки()

Назначение = Новый Массив;

Назначение.Добавить("Документ.ИмяДокумента"); // объект для печати, привязки к метаданным

Возврат Назначение;

КонецФункции

Функция ПолучитьТаблицуКоманд()

Команды = Новый ТаблицаЗначений;

Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));

Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));

Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));

Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));

Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));

Возврат Команды;

КонецФункции

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование,

                                                    ПоказыватьОповещение = Ложь, Модификатор = "")

НоваяКоманда = ТаблицаКоманд.Добавить();

НоваяКоманда.Представление = Представление;

НоваяКоманда.Идентификатор = Идентификатор;

НоваяКоманда.Использование = Использование;

НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;

НоваяКоманда.Модификатор = Модификатор;

КонецПроцедуры

Функция РазложитьМассивПоТипамОбъектов(МассивОбъектов)

СтруктураТипов = Новый Структура;

Для Каждого Объект Из МассивОбъектов Цикл

Если ТипЗнч(Объект) = Тип("ДокументСсылка.ЗаказКлиента") Тогда

Если НЕ СтруктураТипов.Свойство("ЗаказКлиента") Тогда

МассивПоступлений = Новый Массив;

СтруктураТипов.Вставить("ЗаказКлиента", МассивПоступлений);

КонецЕсли;

СтруктураТипов.ЗаказКлиента.Добавить(Объект);

КонецЕсли;

КонецЦикла;

Возврат СтруктураТипов;

КонецФункции

Методика переопределения хранения механизма печатной формы в отдельной обработке

Например, вместо:

  УправлениеПечатьюКлиент.ВыполнитьКомандуПечати("Документ._ДемоСчетНаОплатуПокупателю",

              "СчетЗаказ",

              ПараметрКоманды,

              ПараметрыВыполненияКоманды.Источник,

              ПараметрыПечати);

должно быть:

  УправлениеПечатьюКлиент.ВыполнитьКомандуПечати("Документ._ДемоСчетНаОплатуПокупателю",

              "Обработка._ДемоПечатнаяФорма.СчетЗаказ",

              ПараметрКоманды,

              ПараметрыВыполненияКоманды.Источник,

              ПараметрыПечати);

Методика подключения новой внутренней печатной формы

Методика подключения печати комплектом

&НаКлиенте

Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

  ПараметрыПечати = Новый Структура;

  ПараметрыПечати.Вставить("ПереопределитьПользовательскиеНастройкиКоличества", Истина);

  //ПараметрыПечати.Вставить("ФиксированныйКомплект", Истина);

   Если УправлениеПечатьюКлиент.ПроверитьДокументыПроведены(ПараметрКоманды) Тогда

               УправлениеПечатьюКлиент.ВыполнитьКомандуПечати("Документ._ДемоСчетНаОплатуПокупателю",

                                              "СчетЗаказ,СчетЗаказ,Акт",

                                                ПараметрКоманды, ПараметрыВыполненияКоманды.Источник, ПараметрыПечати );

     КонецЕсли;

КонецПроцедуры

Вызов обработки печати каждого из видов печатных форм ("СчетЗаказ" и "Акт") должен располагаться в процедуре "Печать" модуля менеджера документа.

Методика подключения новой внутренней печатной формы с быстрой печатью

Методики печати "в файл", работа через "COM-объекты"

Методика разработки печатной формы с печатью "в файл"

1) Разработать внутреннюю печатную форму по методике подключения новых внутренних печатных форм (см. материалы 3 занятия).

2) В процедуре обработки команды печати использовать параметр печати с ключом "ФорматСохранения" и значением из системного перечисления "ТипФайлаТабличногоДокумента".

Например:

  ПараметрыПечати.Вставить("ФорматСохранения", ТипФайлаТабличногоДокумента.PDF);  

На текущем этапе развития платформы возможно сохранение в файлы следующих форматов:

  

  

Методика подключения печатных форм на основе офисных макетов

1) Создать и разместить в конфигурации макет, созданный в офисном приложении (Microsoft Word или OpenOffice.org Writer), включающего в себя все необходимые области.   Макет размещать в конфигурации только посредством конструктора макета "Двоичные данные"

2) Создать в дереве метаданных команду печати. Для этой команды задать следующие свойства:

● тип параметра команды – включить ссылку на нужный объект;

● режим использования параметра – «Множественный»;

● группа – группа команд «Печать».

В модуле команды сразу поместить код на основе файла шаблона "ШаблонОбработкиКомандыПечатиОфиснДок.txt" и внести исправления в фрагменты, помеченные угловыми скобками < >. 

3) Внести коррективы в функцию "ПолучитьДанныеПечати" модуля менеджера документа и в обслуживающие ее  функции:

4) Вернуться в модуль команды и отработать заполнение  формируемого документа нужными областями.

  

  

Методика подключения внешней печатной формы при помощи файла шаблона

1) Сделать клон из файла шаблона "ШаблонВнешнейОбработкиПечатиНаОсновеТабличногоДокумента.epf", переименовав и сохранив его посредством пункта меню "Файл/Сохранить как";

2) Внести изменения в модуле объекта полученной обработки:

2.1) Исправить параметры функции "СведенияОВнешнейОбработке";

2.2) Исправить параметры в процедуре "Печать";

2.3) В функции "СформироватьПечатнуюФорму" воспользоваться "Конструктором запроса с обработкой результата" для формирования печатной формы (при составлении запроса не забудьте про необходимость выходного поля "Ссылка" и наложение условия "В" по этому полю);

2.4) Использовать закомментированные фрагменты функции для подключения к стандарту.

 

Методика подключения внешней печатной формы на основе офисного документа при помощи файла шаблона

1) Сделать клон из файла шаблона "ШаблонВнешнейОбработкиФормированияОфисногоДокумента.epf", переименовав и сохранив его посредством пункта меню "Файл/Сохранить как";

2) Внести изменения в модуле объекта полученной обработки:

2.1) Исправить параметры функции "СведенияОВнешнейОбработке";

3) Заменить макет в обработке

4) Внести правки в модуле формы обработки, используя закомментированные фрагменты в качестве примеров

4.1) в функцию "ПолучитьДанныеДокументов";

4.2) в функцию "ПолучитьДанныеОбъекта";

4.3) в функцию "ПолучитьОписаниеОбластейМакетаОфисногоДокумента";

4.4) в процедуру "Печать".

Обыкновенные формы (примеры)

Связь в выборе по типу документа в обычной форме

Дано:  Документ "РучнаяОперация" по регистру Бухгалтерии

Субконто меняются на разных Счетах. Выбирается комбинация:

Субконто1 = Контрагент

Субконто2 = Документ (движение по контрагенту)

Надо: Наложить ограничение по выбору субконто2 из списка документов только по Контрагент.

Решение (Передать параметр для настройки фильтра в ФормуВыбора):

1. Обработка события НачалоВыбора, ДокументРучнаяОперация:

СтандартнаяОбработка = Ложь;

фр = Документы[Элемент.Значение.Метаданные().Имя].ПолучитьФормуВыбора(,ЭтаФорма,);

со = Новый Структура;

со.Вставить("Организация",Организация);

со.Вставить("Контрагент",ТекДан.СубконтоКт1);

фр.СтруктураОтбора = со;

фр.Открыть();

Где  СтруктураОтбора - Ревизит в получаемой форме выбора.

2. ФормаВыбора:

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)

   Для Каждого ТекЭлемент Из СтруктураОтбора Цикл

      Отбор[ТекЭлемент.Ключ].Установить(ТекЭлемент.Значение);

   КонецЦикла;

КонецПроцедуры

Ограничение по допустимым типам субконто

Дано:  Документ "РучнаяОперация" по регистру Бухгалтерии

Счет = Любой счет из плана счетов

Надо: Наложить ограничение по выбору на

Субконто1 = 

Субконто2 = 

Субконто2 = 

Решение:

Процедура СчетПриИзменении(Элемент)

Для йй=1 По 3 Цикл

ЭлементыФормы["Субконто"+йй].ВыбиратьТип = Истина;

ЭлементыФормы["Субконто"+йй].Значение = Неопределено;

ЭлементыФормы["Субконто"+йй].Доступность = Ложь;

КонецЦикла;

Для йй=1 По СчетСписания.ВидыСубконто.Количество() Цикл

ТипСубк = СчетСписания.ВидыСубконто[йй-1].ВидСубконто.ТипЗначения;

ЭлементВвода = ЭлементыФормы["Субконто"+йй];

ЭлементВвода.ОграничениеТипа = Новый ОписаниеТипов(ТипСубк.Типы());

й1 = ЭлементВвода.Значение;

ЭлементВвода.Значение = ЭлементВвода.ОграничениеТипа.ПривестиЗначение(й1);

ЭлементВвода.ВыбиратьТип = (ТипСубк.Типы().Количество()>1);

ЭлементВвода.Доступность = (ТипСубк.Типы().Количество()>0);

КонецЦикла;

КонецПроцедуры

1С: Предприятие 8.3 Сервер приложение Оптимизация Microsoft SQL сервера

/* Раз в день */

use db_name

exec sp_msforeachtable N'UPDATE STATISTICS ? WITH FULLSCAN'

GO

use db_name

DBCC FREEPROCCACHE

GO

/* Раз в неделю */

sp_msforeachtable N'DBCC INDEXDEFRAG (db_name, ''?'')'

GO

sp_msforeachtable N'DBCC DBREINDEX (''?'')'

GO

/* Изменение таблицы кодировки */

USE master;

GO

ALTER DATABASE MySchema COLLATE Cyrillic_General_CI_AS ;

GO

--Verify the collation setting.

SELECT name, collation_name FROM sys.databases WHERE name = N'MySchema';

GO

/* Backup средствами MS SQL */

cat 1.sql <<EOF

DECLARE @pn NVARCHAR(512) 

SET @pn = 'xxx\dd' + Convert(varchar(8), GETDATE(), 112) + '.bak' 

BACKUP DATABASE dd TO DISK = @pn WITH NOFORMAT, NOINIT, NAME = N'bla-bla-bla',

      SKIP, NOREWIND, NOUNLOAD, STATS = 10 /* Differential */

EOF

cat 1.bat <<EOF

sqlcmd -S ss -U uu -P pp -i 1.sql

EOF

Сервер приложение и SQL сервер требует от 300 до 500 Мб ОЗУ на одного клиента.

При существенном увеличении памяти разумен переход на 1С сервер приложение 64 бита.

1С: Предприятие 8.3 Сервер приложение Linux (UBUNTU)

Управление 1С:сервером

Серверная часть:

/opt/1C/v8.3/x86_64/ras --daemon cluster

Клиент:

/opt/1C/v8.3/x86_64/rac cluster list

/opt/1C/v8.3/x86_64/rac help

/opt/1C/v8.3/x86_64/rac help cluster

/opt/1C/v8.3/x86_64/rac help infobase

/opt/1C/v8.3/x86_64/rac infobase --cluster=<uuid> summary list

Активация лицензий

apt-get install default-jre

cd /opt/1C/v8.3/x86_64/ExtDst/

dpkg -i 1c-enterprise-license-tools_0.1.0-22_amd64.deb

dpkg -i 1c-enterprise-ring_0.6.0-15_amd64.deb

Пример команды активации:

/opt/1C/1CE/x86_64/ring/ring license activate \

--country \

--first-name \

--house \

--last-name \

--pin \

--serial \

--street \

--town \

--zip-code 

help

/opt/1C/1CE/x86_64/ring/ring help

/opt/1C/1CE/x86_64/ring/ring license help

Очистка Cache 1C: 8.2 Platform

del \users\<user name>\AppData\Local\1C\1C82\*del \users\<user name>\AppData\Roaming\1C\1C82\*; кроме ExtCompT\*; 1cv8strt.pfl

Запуск Регламентного задания (Файловый вариант)


1.Создать обработку ПланировщикЗаданий

2.Код в Модуле Формы

//ДЛЯ ТОГО ЧТОБЫ РАБОТАЛО В ФАЙЛ-СЕРСЕРНОМ ВАРИАНТЕ

//ДАННАЯ ОБРАБОТКА ДОЛЖНА ВИСЕТЬ В ОТКРЫТОМ ПРИЛОЖЕНИИ, В КЛИЕНТ-СЕРВЕРНОМ ЭТА ОБРАБОТКА НЕ НУЖНА

&НаКлиенте

Процедура ОбработкаЗаданий()

   

    #Если ТолстыйКлиентУправляемоеПриложение Тогда

        ВыполнитьОбработкуЗаданий();

    #КонецЕсли          

   

КонецПроцедуры

&НаКлиенте

Процедура ПриОткрытии(Отказ)

   

    #Если ТолстыйКлиентУправляемоеПриложение Тогда

        ПодключитьОбработчикОжидания("ОбработкаЗаданий", 15);

    #Иначе

        Предупреждение("Обработка может быть запущена только в толстом клиенте!");

        Закрыть();

    #КонецЕсли   

                  

КонецПроцедуры

Число в строку и дополнить нулями слева

Формат( 123,"ЧЦ=9;ЧВН=;ЧГ=0")

Результат - 000000123

1С: Предприятие 8.3 Сервер приложение Включить отладку

WINDOWS

LINUX