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'

Friday, June 19, 2015

1С Управляемые формы ВыборЗначения и получение строк по индексу

Порадовала 1С новой схемой работы. Итог задача есть форма в которой в таблице выбирают значения, после выбранные строки передают дальше на обработку, по привычке пишем код

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


Но не тут то было, после доработки формы с возможностью обработки и обновления данных в таблице значений, при выборе значений появляется ошибка "Индекс находиться за границами массива".
При просмотре конфигуратором натыкаемся на то что после обновления таблицы индексы добавляются заново, хотя этих строк уже в таблице нету. И тут как говориться гугл в помощь и как кому повезет, в общем после поисков находим новый метод "ДанныеСтроки" и получаем работий вариант процедуры. Жесть этого решения состоит в том что этот метод работает только на клиенте, в общем как-то так....

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



Tuesday, May 19, 2015

Android Studio Tips Of the Day - Roundup #6

Полезные hotkeys для Android Studio
Android Studio Tips Of the Day - Roundup #6:

Меня интересовал "Extract Method"

Mac: Cmd+Alt+P
Windows/Linux: Ctrl+Alt+P

'via Blog this'

Friday, April 10, 2015

1С БСП И РЛС

"Будь проклят тот день, когда я сел за баранку этого автомобиля" - наверное каждый скажет этим слова в благодарность 1с и РЛС.
Меня мучает только один вопрос, почему так мало описаний и нет обработок позволяющих быстро проверить всю работу с правами.
Вот возникла у меня проблема, необходимо сделать доступ к документам через РЛС, но часть реквизитов в документе может быть не заполнена, в общем не буду описывать историю радости по поводу поиска как это сделать, сама процедура:

#ПоЗначениямРасширенный( "Документ.Посылка","Чтение","",
"",
"",
"Организации","Т.Организация","И",
"Подразделения","Т.Подразделение","И( ВЫБОР КОГДА Т.СкладОтправитель=Значение(Справочник.Склады.ПустаяСсылка) тогда Истина Иначе ",
"Склады","Т.СкладОтправитель","Конец ИЛИ ВЫБОР КОГДА Т.СкладПолучатель=Значение(Справочник.Склады.ПустаяСсылка) тогда Истина Иначе ",
"Склады","Т.СкладПолучатель","Конец )",
"","","","","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","" )

Tuesday, March 31, 2015

Обмен с Excel

Для продактов часто приходиться выгружать данные в Excel.
Для этого формирую быструю выгрузку

СтрокаПодключения = "
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source="+ИмяФайлаЭксель+";
|Extended Properties=""Excel 12.0 XML;HDR=YES;"";";


// Создаем соединение
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрокаПодключения);
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
Command.CommandType = 1;
//создаем таблицу

Command.CommandText = "CREATE TABLE [Данные_ОтгрузкаБонусы]
|(Менеджер TEXT(100) WITH Compression
|,НаправленияДеятельности TEXT(100) WITH Compression
|,Месяц date
|,ВыручкаUSD Decimal(12,2)
|,ВыручкаUAH Decimal(12,2)
|,СебестоимостьUSD Decimal(12,2)
|,СебестоимостьUAH Decimal(12,2)
|,ВаловаяПрибыльUSD Decimal(12,2)
|,ВаловаяПрибыльUAH Decimal(12,2));";

//И заполняем ее
Command.CommandText = "INSERT INTO [Данные_ОтгрузкаБонусы] VALUES ("
+"'"+СтрЗаменить(СтрокаТабл.НоменклатураОсновнойМенеджер,"'","''") + "'" //Менеджер
+",'"+СтрЗаменить(СтрокаТабл.НоменклатураНаправленияДеятельности,"'","''")+"'" //НаправленияДеятельности
+","+Формат((МесяцыНачало+(2*60*60*24)-Дата(1900,1,1))/(60*60*24),"ЧГ=0")+"" //Месяц
+","+Формат(СтрокаТабл.Выручка,"ЧЦ=12; ЧДЦ=2; ЧРД=.; ЧН=0; ЧГ=0")+"" //ВыручкаUSD
+","+Формат(СтрокаТабл.ВыручкаУпр1,"ЧЦ=12; ЧДЦ=2; ЧРД=.; ЧН=0; ЧГ=0")+"" //ВыручкаUAH
+","+Формат(СтрокаТабл.ОбщаяСебестоимость,"ЧЦ=12; ЧДЦ=2; ЧРД=.; ЧН=0; ЧГ=0")+"" //СебестоимостьUSD
+","+Формат(СтрокаТабл.ОбщаяСебестоимостьUAH,"ЧЦ=12; ЧДЦ=2; ЧРД=.; ЧН=0; ЧГ=0")+"" //СебестоимостьUAH
+","+Формат(СтрокаТабл.ВаловаяПрибыль,"ЧЦ=12; ЧДЦ=2; ЧРД=.; ЧН=0; ЧГ=0")+"" //ВаловаяПрибыльUSD
+","+Формат(СтрокаТабл.ВаловаяПрибыльУпр1,"ЧЦ=12; ЧДЦ=2; ЧРД=.; ЧН=0; ЧГ=0")+"" //ВаловаяПрибыльUAH
+");"+Символы.ПС;
Command.Execute();

Вот принципе и все.
Для расчета даты для excel в 1с использую следующую формулу
(Необходима дата + два дня - 1/1/1900) / (Количество секунд в сутках)
(МесяцыНачало+(2*60*60*24)-Дата(1900,1,1))/(60*60*24)