Thursday, July 16, 2015

1С управляемые формы и отображение картинки...

В 1С работают извращенцы, полные, вот мне честно хочется посмотреть тому дятлу который придумал работу в управляемых формах с картинками и спросить "Ты нормальный?"
Это под какой травкой такое надо было придумать....

В общем задача: отобразить на управляемой форме картинку, отобразить... Карл!!!!!

и итог 3 часа ковыряния как отобразить картинку.


В общем решение:

в управляемых формах принцип следующий:

Простой пример справочника с картинкой

Отображения картинки текущего элемента списка

В новой версии платформы 1С 8.2 работа с картинками производится отличным от предыдущих платформ методом, разобраться с которым без примеров сложно. Подробно можно прочитать в книге Разработка управляемого интерфейса глава 3.18. Работа с файлами и картинками. Примеры данной статья являются переработанными и дополненными примерами книги.

Картинка как и раньше (8.1) хранится в базе в реквизите (реквизите ТЧ) с типом ХранилищеЗначения, но записать данные в реквизит с этим типом обычном способом нельзя, запись производится в предопределенной процедуре «ПередЗаписьюНаСервере».

Для отображения картинки создается элемент формы поле картинки, данными для которого, является реквизит формы (с типом Строка(0)), содержащий навигационную ссылку на картинку (можно получить функцией «ПолучитьНавигационнуюСсылку») или адрес во временном хранилище (пол.ф. «ПоместитьФайл»)

Ниже приведен код части примера:

Код 1C v 8.2 УП
&НаКлиенте

Процедура ЗагрузитьФотографию(Команда)
Перем ВыбранноеИмя,АдресВременногоХранилища;
Если ПоместитьФайл(АдресВременногоХранилища, "", ВыбранноеИмя, Истина, УникальныйИдентификатор) Тогда
АдресКартинки = АдресВременногоХранилища;
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
АдресКартинки = ПолучитьНавигационнуюСсылку(ТекущийОбъект.Ссылка, "Фото");
КонецПроцедуры

&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(АдресКартинки) Тогда
УдалитьИзВременногоХранилища(АдресКартинки);
КонецЕсли;

АдресКартинки = ПолучитьНавигационнуюСсылку(ТекущийОбъект.Ссылка, "Фото");
КонецПроцедуры

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

В процедуре ПриЗаписиНаСервере на первый взгляд можно убрать код удаление из временного хранилища т.к. ф. ПоместитьФайл вызывается с параметром УникальныйИдентификатор формы т.е. объект хранилища будет существовать до закрытия формы, но рекумендуется освобождать ресурсы сразу (если пользователь загрузит картинку и нажмет записать, форма не закрыта и объект будет существовать до закрытия).

Взято тут

Monday, July 13, 2015

1C & REGEX Как упростить себе жизнь

Много времени экономит Regex, очень много, до него код моих программ превращался в монстроидальным и занимавшим не одну сотню строчек. Так что плюсы в нем очень и очень, опишу основные процедуры и функции которые упрощают и ускоряют мне работу.
Вот мои глобальные процедуры
//Простой возврат
Функция RegExp(Знач тСтрока,Паттерн, MultiLine = Истина, Global = Истина, IgnoreCase = Истина) Экспорт //Возвращает первое вхождение
 RegExp = Новый COMОбъект("VBScript.RegExp");
 тСтрока = Строка(тСтрока);
 RegExp.MultiLine = MultiLine; // истина — текст многострочный, ложь — одна строка 
 RegExp.Global = Global; // истина — поиск по всей строке, ложь — до первого совпадения 
 RegExp.IgnoreCase = IgnoreCase; // истина — игнорировать регистр строки при поиске  
 RegExp.Pattern = Паттерн;
 Matches=RegExp.Execute(Строка(тСтрока));
 Если RegExp.Test(тСтрока) тогда
  Возврат Matches.Item(0).SubMatches.Item(0);
 КонецЕсли;
 Возврат Неопределено;
КонецФункции

//Возврат в массив
Функция RegExpМассив(Строка,Паттерн, MultiLine = Истина, Global = Истина, IgnoreCase = Истина) Экспорт 
 RegExp = Новый COMОбъект("VBScript.RegExp");
 
 RegExp.MultiLine = MultiLine; // истина — текст многострочный, ложь — одна строка 
 RegExp.Global = Global; // истина — поиск по всей строке, ложь — до первого совпадения 
 RegExp.IgnoreCase = IgnoreCase; // истина — игнорировать регистр строки при поиске  
 RegExp.Pattern = Паттерн;
 Matches=RegExp.Execute(Строка);
 возМассив = Новый Массив;
 Если RegExp.Test(Строка) тогда
  Для н=0 по Matches.Count-1 Цикл 
   Для х=0 по Matches.Item(н).SubMatches.Count-1 Цикл
    возМассив.Добавить(Matches.Item(н).SubMatches.Item(х));
   КонецЦикла;
  КонецЦикла;
  Возврат возМассив
 КонецЕсли;
 Возврат возМассив;
КонецФункции

//Возврат в таблицу значений
Функция RegExpТаблицаЗначений(Строка,Паттерн, MultiLine = Истина, Global = Истина, IgnoreCase = Истина, КвоКолонок=0) Экспорт
 RegExp = Новый COMОбъект("VBScript.RegExp");
 Тбл = Новый ТаблицаЗначений;
 Если КвоКолонок=0 тогда
  КвоКолонок = СтрЧислоВхождений(Паттерн,"(");
 КонецЕсли;
 Для х=1 по КвоКолонок Цикл
  Тбл.Колонки.Добавить("К"+х);
 КонецЦикла;
 RegExp.MultiLine = MultiLine; // истина — текст многострочный, ложь — одна строка 
 RegExp.Global = Global; // истина — поиск по всей строке, ложь — до первого совпадения 
 RegExp.IgnoreCase = IgnoreCase; // истина — игнорировать регистр строки при поиске  
 RegExp.Pattern = Паттерн;
 Matches=RegExp.Execute(Строка);
 //возМассив = Новый Массив;
 Если RegExp.Test(Строка) тогда
  Для н=0 по Matches.Count-1 Цикл 
   НоваяСтрока = Тбл.Добавить();
   Для х=0 по Matches.Item(н).SubMatches.Count-1 Цикл
    //возМассив.Добавить(Matches.Item(н).SubMatches.Item(х));
    НоваяСтрока["К"+(х+1)]=Matches.Item(н).SubMatches.Item(х);
   КонецЦикла;
  КонецЦикла;
  Возврат Тбл
 КонецЕсли;
 Возврат Тбл;
КонецФункции

//Замена
Функция RegExpRepalce(Pattern, НачальнаяСтрока,ЗаменяемаяСтрока) Экспорт
 
 RegExp = Новый COMОбъект("VBScript.RegExp");
 //СтруктураФайлов = Новый СписокЗначений;
 RegExp.MultiLine = Истина; // истина — текст многострочный, ложь — одна строка 
 RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения 
 RegExp.IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске  
 RegExp.Pattern = Pattern; 
 ВозвращаемаяСтрока = RegExp.Replace(НачальнаяСтрока,ЗаменяемаяСтрока);
 
 //Matches=RegExp.Execute(НачальнаяСтрока);
 //Если RegExp.Test(НачальнаяСтрока) тогда
 // ВозвращаемаяСтрока = Matches.Item(0).SubMatches.Item(0)+Matches.Item(0).SubMatches.Item(1)+HTMLподпись+Matches.Item(0).SubMatches.Item(2);
 // Возврат СтрЗаменить(ВозвращаемаяСтрока,"<%br%>",Символы.ПС);
 //КонецЕсли;
 
 Возврат ВозвращаемаяСтрока;
КонецФункции

//Проверка
Функция RegExpTest(Строка,Паттерн, MultiLine = Истина, Global = Истина, IgnoreCase = Истина) Экспорт 
 RegExp = Новый COMОбъект("VBScript.RegExp");
 
 RegExp.MultiLine = MultiLine; // истина — текст многострочный, ложь — одна строка 
 RegExp.Global = Global; // истина — поиск по всей строке, ложь — до первого совпадения 
 RegExp.IgnoreCase = IgnoreCase; // истина — игнорировать регистр строки при поиске  
 RegExp.Pattern = Паттерн;
 //Matches=RegExp.Execute(Строка); 
 Возврат RegExp.Test(Строка);
 
КонецФункции


Загрузка банковских выписок, на примере банка "Аваль"

Возникла ситуация при которой необходимо было загрузить и обработать выписка банка Аваль. Задача была немного специфичная, но за нее платят - значит делаем.
С первым с чем столкнулся - это выгрузка, получил ее в формате csv, в общем текстовый формат. Интересовала меня распарсивание одной строки

Дата транзакції,"Дата списання","Номер картки ","Тип транзакції","Деталі транзакції","Вхідний залишок","Сума у валюті рахунку","Сума в валюті транзакції","Валюта транзакції","Вихідний залишок"

Для упрощения гемороя в работе со строками, давно использую regex, чего и всем рекомендую. Также рекомендую для тестировани и настройки работы пользоваться сайтом, ну и большое THANKS ребятам которые его сделали.
В общем первое создаем внешнюю обработку, а в ней форму
В форме кроме реквизитов добавляем 2 команды "КомандаЗагрузить" и "СоздатьДокументы", после этого пишем следующий код:


&НаКлиенте
Процедура КомандаЗагрузить(Команда)
 Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
 Диалог.Заголовок = "Выбирете файлы для загрузки в 1С";
 Диалог.Фильтр = "CSV (*.csv)|*.csv|Все файлы|*.*";
 Диалог.МножественныйВыбор=Ложь;
 Диалог.ПроверятьСуществованиеФайла = Истина;
 Если Диалог.Выбрать() Тогда
      ВыбранногоФайла = Диалог.ВыбранныеФайлы[0];
   ТФайл = Новый Файл(ВыбранногоФайла);
   Если ТФайл.Существует() тогда    
    Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВыбранногоФайла));
    ЗагрузитьКассы(Адрес);
   Иначе
    Сообщение = Новый СообщениеПользователю();
       Сообщение.Текст = "Не удалось найти файл:"+ВыбранногоФайла;       
       Сообщение.Сообщить();
   КонецЕсли;  
 КонецЕсли;
КонецПроцедуры

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


Процедура ЗагрузитьКассы(Адрес)
 ВремФайл = ПолучитьИмяВременногоФайла("csv");
 ДанныеХранилища = ПолучитьИзВременногоХранилища(Адрес);
 ДанныеХранилища.Записать(ВремФайл);
 
 ЧФ = Новый ЧтениеТекста(ВремФайл);
 БуфферСтрок = ЧФ.Прочитать();
 ЧФ.Закрыть();
 
 ВремТБЛ = RegExpТаблицаЗначений(БуфферСтрок,"""(\d{2}.\d{2}.\d{4})"",""\d{2}.\d{2}.\d{4}"","".*"","".*"",""Готівкове поповнення.*"",""[\d\s\.]*"",""([\d\s\.]*)"",""[\d\s\.]*"",""UAH"",""[\d\s\.]*""");
 ТаблицаСумм.Очистить();
 Нумерация = 1;
 Для Каждого СтрокаВремТбл из ВремТБЛ Цикл
  НС = ТаблицаСумм.Добавить();
  НС.Номер = Нумерация;
  Нумерация = Нумерация+1;
  НС.Загружать = Истина;
  МассивДаты = МастерПроцедурыСервера.RegExpМассив(СтрокаВремТбл.К1,"(\d{2}).(\d{2}).(\d{4})");
  Если МассивДаты.Количество()=3 тогда
   НС.Дата = Дата(МассивДаты[2],МассивДаты[1],МассивДаты[0]);
  Иначе
   НС.Дата = НаДату;
  КонецЕсли;
  НС.Сумма = Число(СтрЗаменить(СтрокаВремТбл.К2," ",""));
  НС.Контрагент = Контргаент;
 КонецЦикла;
 Элементы.ТаблицаСумм.Подвал=Истина;
 Элементы.ТаблицаСуммСумма.ТекстПодвала = ТаблицаСумм.Итог("Сумма");
 //Элементы.ТаблицаСуммСумма.ПутьКДаннымПодвала
КонецПроцедуры

Функция RegExpТаблицаЗначений(Строка,Паттерн, MultiLine = Истина, Global = Истина, IgnoreCase = Истина) Экспорт //Возвращает первое вхождение
 RegExp = Новый COMОбъект("VBScript.RegExp");
 Тбл = Новый ТаблицаЗначений;
 КвоКолонок = СтрЧислоВхождений(Паттерн,"(");
 Для х=1 по КвоКолонок Цикл
  Тбл.Колонки.Добавить("К"+х);
 КонецЦикла;
 RegExp.MultiLine = MultiLine; // истина — текст многострочный, ложь — одна строка 
 RegExp.Global = Global; // истина — поиск по всей строке, ложь — до первого совпадения 
 RegExp.IgnoreCase = IgnoreCase; // истина — игнорировать регистр строки при поиске  
 RegExp.Pattern = Паттерн;
 Matches=RegExp.Execute(Строка);
 //возМассив = Новый Массив;
 Если RegExp.Test(Строка) тогда
  Для н=0 по Matches.Count-1 Цикл 
   НоваяСтрока = Тбл.Добавить();
   Для х=0 по Matches.Item(н).SubMatches.Count-1 Цикл
    //возМассив.Добавить(Matches.Item(н).SubMatches.Item(х));
    НоваяСтрока["К"+(х+1)]=Matches.Item(н).SubMatches.Item(х);
   КонецЦикла;
  КонецЦикла;
  Возврат Тбл
 КонецЕсли;
 Возврат Тбл;
КонецФункции

&НаКлиенте
Процедура ТаблицаСуммПослеУдаления(Элемент)
 УстановитьНомераСтрок();
КонецПроцедуры

&НаКлиенте 
Процедура УстановитьНомераСтрок()
 Для Каждого СтроТовары из ТаблицаСумм Цикл
  СтроТовары.НомерСтроки = ТаблицаСумм.Индекс(СтроТовары)+1;
 КонецЦикла;
КонецПроцедуры


&НаКлиенте
Процедура ТаблицаСуммПриИзменении(Элемент)
 УстановитьНомераСтрок();
КонецПроцедуры


&НаКлиенте
Процедура СоздатьДокументы(Команда)
 СоздатьДокументыНаСервере();
КонецПроцедуры


&НаСервере
Процедура СоздатьДокументыНаСервере()
 Для Каждого стрТаблицаСумм из ТаблицаСумм Цикл
  Если стрТаблицаСумм.Загружать и не ЗначениеЗаполнено(стрТаблицаСумм.Документ) тогда
   ДокОбъект = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();
   ДокОбъект.Дата = стрТаблицаСумм.Дата;
   ДокОбъект.УстановитьНовыйНомер();
   ДокОбъект.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПоступлениеОплатыОтКлиента;
   ДокОбъект.Контрагент = Контргаент;
   ДокОбъект.Касса = Касса;
   ДокОбъект.Валюта = Касса.ВалютаДенежныхСредств;
   ДокОбъект.Кассир = ПараметрыСеанса.ТекущийПользователь;
   ДокОбъект.Организация = Константы.ОсновнаяОрганизация.Получить();
   ДокОбъект.СуммаДокумента = стрТаблицаСумм.Сумма;
   ДокОбъект.СтатьяДвиженияДенежныхСредств = Справочники.СтатьиДвиженияДенежныхСредств.ПоступлениеОплатыОтКлиента;
   ВремТабл = Мастер.РасшифровкаПлатежаЗаполнитьПоОстаткам(ДокОбъект);
   Если НЕ ВремТабл = неопределено тогда
    ДокОбъект.РасшифровкаПлатежа.Загрузить(ВремТабл);
   КонецЕсли;

   ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
   стрТаблицаСумм.Документ = ДокОбъект.Ссылка;
  КонецЕсли;
 КонецЦикла;
КонецПроцедуры


После этого не забываем, что данную обработку подключим внешней обработкой к УТ11 и добавляем в модуле следующие строки:

Функция СведенияОВнешнейОбработке() Экспорт
 
 Структура = Новый Структура;
 Структура.Вставить("Вид",             "ДополнительнаяОбработка"); //Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка
 Структура.Вставить("Наименование",    "Создание кассовых поступлений");
 Структура.Вставить("Версия",          "1.01");
 Структура.Вставить("БезопасныйРежим", Ложь);
 Структура.Вставить("Информация",      "Создание кассовых поступлений");
 
 Команды = Новый ТаблицаЗначений;
 Команды.Колонки.Добавить("Идентификатор");
 Команды.Колонки.Добавить("Представление");
 Команды.Колонки.Добавить("Модификатор");
 Команды.Колонки.Добавить("ПоказыватьОповещение");
 Команды.Колонки.Добавить("Использование");
 
 
 НоваяСтрока = Команды.Добавить();
 НоваяСтрока.Идентификатор = "1";
 НоваяСтрока.Представление = "Создание кассовых поступлений";
 НоваяСтрока.ПоказыватьОповещение = Истина;
 НоваяСтрока.Использование = "ОткрытиеФормы";
 
 
 Структура.Вставить("Команды", Команды);
 
 
 Возврат Структура;
 
КонецФункции



вот в принципе и все, успехов в работе.

Thursday, July 9, 2015

Создание в УТ11 документов, модуль объекта

Процедуры модуля объектов, базово-минимальные.

Процедура ИнициализироватьДокумент()
 
 Автор = ПараметрыСеанса.ТекущийПользователь;
 Подразделение = Константы.ОсновноеПодразделение.Получить();
  
КонецПроцедуры

Процедура ЗаполнитьДокументКопированием(ДокСсылка)
  
 
КонецПроцедуры

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

Процедура СформироватьСписокРегистровДляКонтроля()
 
 Массив = Новый Массив;
 
 Если ДополнительныеСвойства.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
  //Массив.Добавить(Движения.СвободныеОстатки);
 КонецЕсли;
 
 ДополнительныеСвойства.ДляПроведения.Вставить("РегистрыДляКонтроля", Массив);
 
КонецПроцедуры // СформироватьСписокРегистровДляКонтроля()

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
 Если ОбменДанными.Загрузка Тогда
  Возврат;
 КонецЕсли;
 
 ДополнительныеСвойства.Вставить("ЭтоНовый",    ЭтоНовый());
 ДополнительныеСвойства.Вставить("РежимЗаписи", РежимЗаписи);

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
 ПроведениеСервер.ИнициализироватьДополнительныеСвойстваДляПроведения(Ссылка, ДополнительныеСвойства, РежимПроведения);
 
 //Обращение в модуль менеджера 
 //Документы.Активность.ИнициализироватьДанныеДокумента(Ссылка, ДополнительныеСвойства);
 
 ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);
 
 //Тут указываем по каким регистра делаем дивежние
 //ЗапасыСервер.ОтразитьСвободныеОстатки(ДополнительныеСвойства, Движения, Отказ);
 //ЗапасыСервер.ОтразитьТоварыНаСкладах(ДополнительныеСвойства, Движения, Отказ);
 //ДенежныеСредстваСервер.ОтразитьДенежныеСредстваВКассахККМ(ДополнительныеСвойства, Движения, Отказ);
 //ДенежныеСредстваСервер.ОтразитьРасчетыПоЭквайрингу(ДополнительныеСвойства, Движения, Отказ);
 //СкладыСервер.ОтразитьДвиженияСерийТоваров(ДополнительныеСвойства, Движения, Отказ);
 
 СформироватьСписокРегистровДляКонтроля();
 
 ПроведениеСервер.ЗаписатьНаборыЗаписей(ЭтотОбъект);
 
 ПроведениеСервер.ВыполнитьКонтрольРезультатовПроведения(ЭтотОбъект, Отказ);
 
 ПроведениеСервер.ОчиститьДополнительныеСвойстваДляПроведения(ДополнительныеСвойства);

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

Процедура ОбработкаУдаленияПроведения(Отказ)
 ПроведениеСервер.ИнициализироватьДополнительныеСвойстваДляПроведения(Ссылка, ДополнительныеСвойства);

 ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);

 СформироватьСписокРегистровДляКонтроля();

 ПроведениеСервер.ЗаписатьНаборыЗаписей(ЭтотОбъект);

 ПроведениеСервер.ВыполнитьКонтрольРезультатовПроведения(ЭтотОбъект, Отказ);

 ПроведениеСервер.ОчиститьДополнительныеСвойстваДляПроведения(ДополнительныеСвойства);
КонецПроцедуры

Процедура ПриКопировании(ОбъектКопирования)
 ИнициализироватьДокумент();
КонецПроцедуры



Создание в УТ11 документов, основная форма




HTML Editor - Full Version


Создание в УТ11 документов, основная форма


После создания документа и добавление реквизитов, переходим к оформлению формы:


  1. В процедуру "ПриСозданииНаСервере" добавляем 
    • ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере(ЭтаФорма);
  2. В процедуру "ПриЧтенииНаСервере" добавляем
    • ДатыЗапретаИзменения.ОбъектПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);


Создание в УТ11 документов, права




HTML Editor - Full Version


Создание в УТ11 документов, права


  1. Создаем документ и заполняем основные реквизиты
    • Организация
    • Подразделение
    • Менеджер
    • Автор
    • и т.п.
  2. Прописуем права "Чтение" и "ДобавлениеИзменение". Вначале создаем право "Чтение", заполняем и оформляем, после копирование создаем право "ДобавлениеИзменение". Из примеров "ЧтениеРассылкаПрайсЛистов" и "ДобавлениеИзменениеПрайсЛистов"

  • Не забываем изменить в свойствах прав синоним, дабы в настройках прав все было понятно
  • Добавляем шаблоны ограничений (берем уже из созданых прав), сейчас у меня 3 вида "ПоЗначениям", "ПоЗначениямРасширенный", "ПоЗначениямИНаборамРасширенный"
  • Далее в праве отключаем все галки которые установила 1С, дабы не было проблем с открытым доступом
  • Находим необходимый документ и включаем в нем следующие права "Ввод по строке", "Просмотр",  "Чтение"
  • В чтении добавляем поле "Ограничение к доступа к данным", поля оставляем по умолчанию, а в ограничение доступа добавляем строку #ПоЗначениям( "Документ.РассылкаПрайсЛистов","Чтение","",

    "Подразделения","Подразделение",

    "","",

    "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )
  • После этого копируем право, переименовываем "ДобавлениеИзменение"
  • Добавляем все галки кроме "Удаление", "Интерактивное удаление",  "Интерактивное удаление помеченных", что бы случайно не удалить документы безвозвратно.
  • Далее в правах "Добавление" и "Изменение" добавляем строку в "Ограничение к доступа к данным", и копируем "Ограничение доступа" из "Чтение", заменяя "Чтение" на "Добавление" и "Изменение" #ПоЗначениям( "Документ.РассылкаПрайсЛистов","Добавление","",

    "Подразделения","Подразделение",

    "","",

    "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )

 


 



Thursday, July 2, 2015

matiaspub/bxApiDocs

Bitrix, мне интересно как держится эта шарашкина контора.

В комплекте с IDE колоcально облегчает жизнь разработчику (расхолаживает, обленяет и т.д. - так что будьте осторожны). Фичи:
  • В общем-то само API, с php Docs’ами всеми что удалось автоматически вытащить с ресурсаофициальных доков.
  • Есть даже константы. Но хелпы есть только у тех что можно найти на вышеприведенном ресурсе оф.доков.
  • События модулей. Синтетические классы с набором методов. То есть контейнер с возможными событиями определенного модуля, все также с доками.
Доки с примерами использования и ссылками на ресурс оф.доков. Константы и события находятся в соответствующих модулях в файлах bx_events.php и bx_constants.php (Например /modules/main/bx_events.php и /modules/main/bx_constants.php). Соответственно константы употребленные в файлах bx_constants.php, в местах иx реального употребления закомментированы.
matiaspub/bxApiDocs:

'via Blog this'