Главное правило программирования 1С:
если Объект не работает, удалить Объект и создать заново.






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

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

  • на клиенте доступны только данные форм в универсальных структурах;
  • на сервере доступны данные БД и есть возможность преобразования этих данных в универсальные структуры форм;
  • управлять элементами форм можно и на клиенте и на сервере.

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

  • Форма -> Объект прикладного типа - ДанныеФормыВЗначение / РеквизитФормыВЗначение("ИмяРеквизита");
  • Объект прикладного типа -> Форма - ЗначениеВДанныеФормы(Знач, "Объект") / ЗначениеВРеквизитФормы(Знач, "ИмяРеквизита");

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

  • ДанныеФормыСтруктура;
  • ДанныеФормыКоллекция;
  • ДанныеФормыДерево;
  • ДанныеФормыСтруктураСКоллекцией.

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

&НаСервере
Процедура СохрНастр(имя,зн)
    УстановитьПривилегированныйРежим(Истина);
    ХранилищеОбщихНастроек.Сохранить("РасходнаяНакладная",
            имя,
            зн,
            ,
            Строка(ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор) );
    УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры

&НаСервере
Функция ВостНаст(имя)
    УстановитьПривилегированныйРежим(Истина);
    зн = ХранилищеОбщихНастроек.Загрузить("РасходнаяНакладная",
            Имя,
            ,
            Строка(ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор) );
    УстановитьПривилегированныйРежим(Ложь);
    Возврат зн;
КонецФункции

&НаКлиенте
Процедура сохр(Команда)
    СохрНастр("Имя1",123);
    Сообщить(ВостНаст("Имя1"));
КонецПроцедуры

УТ 8.2 10.3  Ограничение доступа к Контрагентам и Организациям Определенного пользователя (Менеджер).

  1. Определить доступ пользователя Менеджер на уровне таблиц и колонок таблиц. Присвоить пользователю Менеджер Роль, например Пользователь (обязательно) и Менеджер по продажам, Менеджер по закупкам. Добавление новых контрагентов запрещено этим Ролям запрещено.
  2. Настройка параметров учета, Установить "Ограничивать право доступа на уровне записей"
  3. Справочник.ГруппыДоступаККонтрагентам - добавить ГрДоступаККонтрагМенеджеры
  4. Справочник.Контрагенты - установить Прочее -> Группа доступа к котрагенту ГрДоступаККонтрагМенеджеры
  5. Справочник.ГруппыПользователей - привязка Пользователей и Видов объектов доступа к Группе. Виды объектов доступа Организация и Контрагент включает контроль отображения по соответствующему виду.
  6. "Настройка прав доступа пользователей" можно перейти из Справочник.ГруппыПользователей. Связывает Справочник.ГруппыПользователей И Справочник.ГруппыДоступаККонтрагентам И Объекты контроля (Организация, Контрагент). Связь влияет на отображение ГруппеПользователей Объектов во всех документах.

Флаг “Запись” - разрешает записывать изменения по контрагенту, на Организацию не влияет.
Поле “Вид наследования прав доступа иерархических справочников” должно переносить права внутри иерархических справочников, согласно параметра “Наследуется от родителя”, “Распространить на подчиненных”, “Только для текущего права”. Имеет смысл только для Контрагентов, но Справочник.Контрагенты.ГруппаДоступаККонтрагенту существует только для элемента, поэтому наследственность теряет смысл. Наследственность групп пользователей не проверял.
Поле “Область данных” возможное значение “Контрагенты (СПИСОК)” - на отображение влияние не оказывал.
Поле “Владелец прав доступа” - для организации смысла не имеет.



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

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

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

Движения -> Проведение = Запрещено;
Добавить сторнируемые регистры; Данные -> Сторнируемый Документ.

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

Функция ПринКлассуМД(Класс,Объект)
    Для каждого мдОб Из Метаданные[Класс] Цикл
        Если мдОб = Объект Тогда
            Возврат Истина;
        КонецЕсли;
    КонецЦикла;
    Возврат Ложь;
КонецФункции
Процедура ЗаполнитьЗаписьСторно(дв, сДВ, рег)
    Для каждого мдОб Из рег.Измерения Цикл
        дв[мдОб.Имя] = сДВ[мдОб.Имя];
    КонецЦикла;
    Для каждого мдОб Из рег.Ресурсы Цикл
        дв[мдОб.Имя] = -сДВ[мдОб.Имя];
    КонецЦикла;
    Для каждого мдОб Из рег.Реквизиты Цикл
        дв[мдОб.Имя] = сДВ[мдОб.Имя];
    КонецЦикла;
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    СторнируемыйДокумент.Ссылка
        |ИЗ
        |    Документ."+СторнируемыйДокумент.Метаданные().Имя+" КАК СторнируемыйДокумент
        |ГДЕ
        |    СторнируемыйДокумент.Ссылка = &Ссылка
        |    И СторнируемыйДокумент.МоментВремени < &МоментВремени";

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

    Если Запрос.Выполнить().Пустой() Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Несторнируемый документ!";
        Сообщение.Сообщить();
        отказ = Истина;
        Возврат;
    КонецЕсли;
   
    Для каждого сРег Из СторнируемыйДокумент.Метаданные().Движения Цикл
        Если Не Метаданные().Движения.Содержит(сРег) Тогда
            Продолжить;
        КонецЕсли;
       
        этоРР = Ложь; этоРН = Ложь;    этоРБ = Ложь;
       
        Если ПринКлассуМД("РегистрыРасчета",сРег) Тогда
            этоРР = Истина;
            нз = РегистрыРасчета[сРег.Имя].СоздатьНаборЗаписей();
        ИначеЕсли ПринКлассуМД("РегистрыНакопления",сРег) Тогда
            этоРН = Истина;
            нз = РегистрыНакопления[сРег.Имя].СоздатьНаборЗаписей();
        ИначеЕсли ПринКлассуМД("РегистрыБухгалтерии",сРег) Тогда
            этоРБ = Истина;
            нз = РегистрыБухгалтерии[сРег.Имя].СоздатьНаборЗаписей();
        КонецЕсли;
       
        нз.Отбор.Регистратор.Значение = СторнируемыйДокумент;
        нз.Прочитать();
       
        Для каждого сДВ Из нз Цикл
            дв = Движения[сРег.Имя].Добавить();
            ЗаполнитьЗаписьСторно(дв,сДВ,сРег);
            Если этоРН Тогда
                дв.Период = Дата;
                Если сРег.ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки Тогда
                    дв.ВидДвижения = сДВ.ВидДвижения;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры


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

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

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

2-й Способ

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

нб.Отбор.Штрихкод.Установить(шк);
нб.Отбор.Владелец.Установить(нмСсылка);
нб.Отбор.ЕдиницаИзмерения.Установить(еиСсылка);
нб.Отбор.ТипШтрихкода.Установить(вшкСсылка);
нб.Отбор.Качество.Установить(качествоТовара);

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

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

зап.Штрихкод = шк;
зап.Владелец = нмСсылка;
зап.ЕдиницаИзмерения = еиСсылка;
зап.ТипШтрихкода = вшкСсылка;
зап.Качество = качествоТовара;
зап.ПредставлениеШтрихкода = шк;
Попытка
     зап.Записать();
Исключение
КонецПопытки;

Easy OS Tricks & Programs

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

Отправлено 8 мар. 2017 г., 0:55 пользователем Nikolay Nikolaev   [ обновлено 1 апр. 2017 г., 2:52 ]

Управление 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

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

Отправлено 8 мар. 2017 г., 0:45 пользователем Nikolay Nikolaev   [ обновлено 8 мар. 2017 г., 0:58 ]

Оптимизация Microsoft SQL сервера для 1С

/* Раз в день */
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 бита.

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

Отправлено 30 мар. 2014 г., 1:13 пользователем Nikolay Nikolaev   [ обновлено 12 сент. 2015 г., 8:55 ]

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

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

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

Например:

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

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

  • ANSITXT
  • DOCX
  • HTML
  • HTML3
  • HTML4
  • MXL
  • MXL7
  • ODS
  • PDF
  • TXT
  • XLS
  • XLS95
  • XLS97
  • XLSX

  

  

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

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) в процедуру "Печать".

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

Отправлено 30 мар. 2014 г., 1:08 пользователем Nikolay Nikolaev   [ обновлено 12 сент. 2015 г., 8:54 ]

  1. Создать внутреннюю печатную форму.
  2. Перенести  из процедуры "Печать" модуля менеджера документа в процедуру "Печать" модуля менеджера обработки печати фрагмент, посвященный новой печатной форме.
  3. Переопределить вызов вспомогательного функционала для перенесенного фрагмента на вызов из модулей менеджеров соответствующих документов, если оставляете его там. Или перенести вспомогательный функционал  в модуль менеджера обработки, но тогда запросы должны стать универсальными для всех видов используемых в печатной форме документов (т.е. например, должны строиться объединением данных разных видов документов).
  4. В модуле команды параметр "имя макета" написать через обращение к обработке.

Например, вместо:
  УправлениеПечатьюКлиент.ВыполнитьКомандуПечати("Документ._ДемоСчетНаОплатуПокупателю",
              "СчетЗаказ",
              ПараметрКоманды,
              ПараметрыВыполненияКоманды.Источник,
              ПараметрыПечати);

должно быть:
  УправлениеПечатьюКлиент.ВыполнитьКомандуПечати("Документ._ДемоСчетНаОплатуПокупателю",
              "Обработка._ДемоПечатнаяФорма.СчетЗаказ",
              ПараметрКоманды,
              ПараметрыВыполненияКоманды.Источник,
              ПараметрыПечати);

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

Отправлено 30 мар. 2014 г., 1:03 пользователем Nikolay Nikolaev   [ обновлено 12 сент. 2015 г., 8:55 ]

  1. Создать внутренние печатные формы;
  2. В процедуре-обработчике команды печати, при вызове "УправлениеПечатьюКлиент.ВыполнитьКомандуПечати" второй параметр (ИменаМакетов) должен содержать через запятую, но без пробелов, все имена макетов документов комплекта. 
  3. Количество экземпляров конкретной печатной формы заказывается указанием имени нужного макета через запятую в вышеприведенном параметре.
  4. Процедура "Печать" в модуле менеджера документа, указанного в первом параметре вышеприведенной процедуры, должна содержать абзацы обработки каждого из вышеприведенных имен макетов.
  5. Если необходимо запретить изменение количества  копий при печати комплекта - надо задействовать элемент параметров печати с ключом "ФиксированныйКомплект".
  6. Если необходимо при закрытии печатной формы каждый раз сбрасывать измененное  пользователем количество  копий документов комплекта - надо задействовать элемент параметров печати с ключом "ПереопределитьПользовательскиеНастройкиКоличества". 

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
  ПараметрыПечати = Новый Структура;
  ПараметрыПечати.Вставить("ПереопределитьПользовательскиеНастройкиКоличества", Истина);
  //ПараметрыПечати.Вставить("ФиксированныйКомплект", Истина);
   Если УправлениеПечатьюКлиент.ПроверитьДокументыПроведены(ПараметрКоманды) Тогда
               УправлениеПечатьюКлиент.ВыполнитьКомандуПечати("Документ._ДемоСчетНаОплатуПокупателю",
                                              "СчетЗаказ,СчетЗаказ,Акт",
                                                ПараметрКоманды, ПараметрыВыполненияКоманды.Источник, ПараметрыПечати );
     КонецЕсли;
КонецПроцедуры

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

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

Отправлено 30 мар. 2014 г., 0:57 пользователем Nikolay Nikolaev   [ обновлено 12 сент. 2015 г., 8:54 ]

  1. Создать новую печатную форму;
  2. Заменить содержимое команды печати на вызов процедуры «ВыполнитьКомандуПечатиНаПринтер» (при этом первым параметром надо будет указать имя объекта, в модуле менеджера которого будет исполняющая процедура «Печать», а вторым – имена макетов, для которых должны быть сформированы табличные документы);
  3. Добавить префикс ПФ_MXL_ к имени сформированного конструктором макета;
  4. Добавить в процедуре «Печать» модуля менеджера документа фрагмент, посвященный формированию табличного документа для новой печатной формы и вызову процедуры «ВывестиТабличныйДокументВКоллекцию» с передачей ей этого табличного документа;
  5. Процедуру, формирующую наш табличный документ, превратить в функцию и точечно поправить в ней (по аналогии с подобными функциями):
  • параметры в заголовке;
  • объявление табличного документа;
  • получение макета по имени с префиксом;
  • определение номера строки начала табличного документа;
  • задание областей печати;
  • возврат табличного документа.

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

Отправлено 30 мар. 2014 г., 0:52 пользователем Nikolay Nikolaev   [ обновлено 12 сент. 2015 г., 8:54 ]

  1. Создать новую печатную форму;
  2. Заменить содержимое команды печати на вызов процедуры «ВыполнитьКомандуПечати» (при этом первым параметром надо будет указать имя объекта, в модуле менеджера которого будет исполняющая процедура «Печать», а вторым – имена макетов, для которых должны быть сформированы табличные документы);
  3. Добавить префикс ПФ_MXL_ к имени сформированного конструктором макета;
  4. Добавить в процедуре «Печать» модуля менеджера документа фрагмент, посвященный формированию табличного документа для новой печатной формы и вызову процедуры «ВывестиТабличныйДокументВКоллекцию» с передачей ей этого табличного документа;
  5. Процедуру, формирующую новый табличный документ, превратить в функцию и точечно поправить в ней (по аналогии с подобными функциями):
  • параметры в заголовке;
  • объявление табличного документа и установка уникального значения КлючПараметровПечати табличного документа;
  • получение макета по имени с префиксом через функцию УправлениеПечатью.ПолучитьМакет();
  • в выходной таблице запроса обязательно должно быть поле Ссылка (содержащее ссылку на печатаемый документ) 
  • определение номера строки начала табличного документа;
  • задание областей печати;
  • возврат табличного документа.

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

Отправлено 20 мар. 2014 г., 11:38 пользователем Nikolay Nikolaev   [ обновлено 12 сент. 2015 г., 8:52 ]

Формат( 123,"ЧЦ=9;ЧВН=;ЧГ=0")
Результат
000000123

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

Отправлено 2 окт. 2013 г., 14:16 пользователем Nikolay Nikolaev   [ обновлено 12 сент. 2015 г., 8:03, автор: Nikolay Nikolaev ]

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



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

Отправлено 2 июл. 2013 г., 14:12 пользователем Nikolay Nikolaev   [ обновлено 25 июл. 2013 г., 1:44, автор: Nikolay Nikolaev ]

1.Создать обработку ПланировщикЗаданий
2.Код в Модуле Формы

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

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

&НаКлиенте
Процедура ОбработкаЗаданий()
   
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        ВыполнитьОбработкуЗаданий();
    #КонецЕсли          
   
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
   
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        ПодключитьОбработчикОжидания("ОбработкаЗаданий", 15);
    #Иначе
        Предупреждение("Обработка может быть запущена только в толстом клиенте!");
        Закрыть();
    #КонецЕсли   
                  
КонецПроцедуры

1-10 of 11