26 нояб. 2016 г.

Использование в отборе Категорий в СКД

Конфигурация Управление Торговлей.

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


Для решения открываем наш запрос и в конце запроса добавляем 
{ХАРАКТЕРИСТИКИ
   ТИП(Справочник.Номенклатура)
   ВИДЫХАРАКТЕРИСТИК (ВЫБРАТЬ
         СвойстваОбъектов.Ссылка,
         СвойстваОбъектов.ТипЗначения,
         "Свойство: " + СвойстваОбъектов.Наименование КАК Наименование
      ИЗ
         ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов
      ГДЕ
         СвойстваОбъектов.НазначениеСвойства = ЗНАЧЕНИЕ(ПланВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура))
   ПОЛЕКЛЮЧА Ссылка
   ПОЛЕИМЕНИ Наименование
   ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения
   ЗНАЧЕНИЯХАРАКТЕРИСТИК РегистрСведений.ЗначенияСвойствОбъектов
   ПОЛЕОБЪЕКТА Объект
   ПОЛЕВИДА Свойство
   ПОЛЕЗНАЧЕНИЯ Значение }
{ХАРАКТЕРИСТИКИ
   ТИП(Справочник.Номенклатура)
   ВИДЫХАРАКТЕРИСТИК (ВЫБРАТЬ
         КатегорииОбъектов.Ссылка,
         "Категория: " + КатегорииОбъектов.Наименование КАК Наименование
      ИЗ
         Справочник.КатегорииОбъектов КАК КатегорииОбъектов
      ГДЕ
         КатегорииОбъектов.НазначениеКатегории = ЗНАЧЕНИЕ(ПланВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура))
   ПОЛЕКЛЮЧА Ссылка
   ПОЛЕИМЕНИ Наименование
   ЗНАЧЕНИЯХАРАКТЕРИСТИК РегистрСведений.КатегорииОбъектов
   ПОЛЕОБЪЕКТА Объект
   ПОЛЕВИДА Категория
}
Взято с ссылка

Переопределить кнопку Выбора 7.7

Есть форма элемента Справочника с реквизитом типа Ссылка на Документ.РасходнаяНакладная.
Нужно при нажатии кнопки открытия этого реквизита открывался не список документов, а конкретный документ


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

Обработка нажатия формы списка 7.7

Пример, есть форма списка Справочника с несколькими колонками


В свойствах этого справочника стоит настройка Редактировать: В диалоге


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

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

 Форма.ОбработкаВыбораСтроки(1);
А значит, если пользователь выбрал колонку Документ (Док) то будет открыт форма документа, а если выбрал любую другую колонку тогда мы ищем из текущей строки объект по коду в нашем справочнике и открываем его.

11 нояб. 2016 г.

Назначить тип реквизиту 7.7

Есть Документ.ПКО в которого есть реквизит с типом Неопределенній


при программном заполнении реквизита этого документа прежде чем заполнить реквизит "субконто" ему нужно назначить тип, для этого 
Док = СоздатьОбъект("Документ.ПКО");
//назначем реквизиту Субконтотип Справочник.Номенклатура
Док.НазначитьТип("Субконто","Справочник.Номенклатура"); 

28 окт. 2016 г.

Добавить в контекстное меню Обычные формы

Что бы добавить в контекстное меню ("ПКМ" по Табличной части) свою команду нужно:

  • На форму добавляем "Командная панель"
  • "ПКМ" по добавленной на форме командной панели - добавляем команду
  • Добавленной панели устанавливаем свойство "Видимость" = Ложь
  • В свойстве "КонтекстноеМеню" Табличной части указываем нашу добавленную ранее панель 

Результат



Итоги в табличном документ Обычное формы

Для отображения Итого (в Подвале) табличной части не управляемых форм нужно:

  • в свойствах Табличной части на форме установить галку "Подвал"
  • в свойствах Колонки табличной части (с типом Число) найти и установить галку "ОтображатьИтогВПодвале"

Вывести полное наименование в типовый отчет

Возьмем, например типовый отчет "Ведомость по товарам в розницу" конфигурации "Управление торговлей для Украины", редакция 2.3. Если зайти в выбор Поле (Группировка строк) то увидим, что Полное наименование, из справочника номенклатура никак не вытянуть, этого поля нет.

Что бы выводить Полное наименование номенклатуры нужно зайти в расширенные настройки Настроек, перейти на вкладку Дополнительные поля и уже там будет возможность из справочника Номенклатура вытянуть поле Полное наименование.


в результате получаем то что нужно




26 окт. 2016 г.

Запись xml из строки 7.7

Для сохранения хмл строки в хмл документ выполним
 Попытка
  ТекстовыйДокумент = СоздатьОбъект("Текст"); 
  ТекстовыйДокумент.Записать("D:\1.xml"); 
  
  ТекстовыйДокумент.Открыть("D:\1.xml");
  ТекстовыйДокумент.ДобавитьСтроку(ИмяВыбрФайла);  
  ТекстовыйДокумент.КодоваяСтраница(0);  
  ТекстовыйДокумент.Записать("D:\1.xml");         
  Предупреждение("ОК");    
 Исключение    
  Сообщить(ОписаниеОшибки());
 КонецПопытки;
!ИмяВыбрФайла - это строка в виде хмл

An invalid character was found in text content 1С 7.7

При чтении хмл файла получаю
"................ An invalid character was found in text content."

дело здесь в кодировке.
Открыл файл, изменил кодировку на WINDOWS-1251


ошибка исчезла.

Прочитать xml 7.7

Подключаясь  к АПИ "Новой почты", сервис отдает строку в виде хмл документа с которого нужно получить значения тегов.

Для разбора хмл будем использовать v7plus.dll.
Два файла из архива нужно закинуть в C:\Program Files (x86)\1Cv77\BIN\
И после этого запустить cmd.exe от имени администратора и выполнить
regsvr32 /u "C:\Program Files (x86)\1Cv77\BIN\v7chart.dll"

Запись в хмл документ из строки
 Попытка
  ТекстовыйДокумент = СоздатьОбъект("Текст"); 
  ТекстовыйДокумент.Записать("D:\1.xml"); 
  
  ТекстовыйДокумент.Открыть("D:\1.xml");
  ТекстовыйДокумент.ДобавитьСтроку(ИмяВыбрФайла);  
  ТекстовыйДокумент.КодоваяСтраница(0);  
  ТекстовыйДокумент.Записать("D:\1.xml");         
  Предупреждение("ОК");    
 Исключение    
  Сообщить(ОписаниеОшибки());
 КонецПопытки;
!ИмяВыбрФайла - это строка в виде хмл от "новой почты"

Чтение файла хмл
 Если ЗагрузитьВнешнююКомпоненту("v7plus.dll") = 0 Тогда 
  Предупреждение("v7plus!"); 
  Возврат; 
 КонецЕсли; 
 
 XMLАнализатор = СоздатьОбъект("AddIn.XMLParser");
 XMLДокумент = XMLАнализатор.СоздатьДокумент();
 XMLДокумент.Загрузить("D:\1.xml");
 XMLКорневойРаздел = XMLДокумент.ВыбратьУзлы("*");
 XMLКорневойРаздел = XMLКорневойРаздел.ПолучитьУзел(0);
 ДанныеXML = XMLКорневойРаздел.ВыбратьУзлы("*");
 Для Сч1 = 0 По ДанныеXML.КоличествоУзлов() - 1 Цикл
  ТС = ДанныеXML.ПолучитьУзел(Сч1);   
  
  ДанныеXML2 = ТС.ВыбратьУзлы("*");     
  Для Сч2 = 0 По ДанныеXML2.КоличествоУзлов() - 1 Цикл  
   ТС2 = ДанныеXML2.ПолучитьУзел(Сч2);  
   
   ДанныеXML3 = ТС2.ВыбратьУзлы("*");  
   Для Сч3 = 0 По ДанныеXML3.КоличествоУзлов() - 1 Цикл   
    ТС3 = ДанныеXML3.ПолучитьУзел(Сч3);  
    Сообщить(ТС3.Текст);  
   КонецЦикла;

  КонецЦикла;  
 КонецЦикла;  
на выходе получаю

25 окт. 2016 г.

Подключиться к сайту с 7.7

Для подключение к  API "Новой почты" с 7-ки выполняем
 HTTPxml = СоздатьОбъект("MSXML2.xmlHttp.4.0");     
 HTTPxml.Open("POST", "https://api.novaposhta.ua/v2.0/xml/", 0 );
 HTTPxml.setRequestHeader("Content-Type", "text/xml");    
  
 HTTPxml.Send(запрос);      
 Результат = HTTPxml.responseText;
в переменную Результат будет возвращено ответ в виде .xml

22 окт. 2016 г.

Отчет Неликвиды для 1С 7.7

  • Есть возможность устанавливать условия на неликвиды как на уровне ТМЦ\группы, а также Складам 
  • Есть галка сортировки по колонке «Конечная сумма» 
  • Можно устанавливать порог не ликвидности, который отсечет в отчете неликвиды 
  • больше нужного «числа» 
! Разрабатывалось для Бухгалтерия+Торговля+Производство+Зарплата+Кадры для Украины 


Логика «неликвидов»:
С начала стоит условие на начальное количество ТМЦ за период должно быть больше 0, тогда в отчет ТМЦ попадает, а далее если первое условие пройдено рассчитываем ликвидность формулой
Расход/(НачальныйОстаток+Приход)*100 и уже рассчитанный результат должен быть  >= ликвидности (числа), который указываем на форме отчета.
Отчет скачать

17 окт. 2016 г.

История изменения объектов 1С

// Универсальная процедура, регистрирующая изменения реквизитов объекта (справочник, документ, план обмена, ПВХ)
// в журнале регистрации
//
Процедура РегистрацияИзмененийРеквизитовОбъекта(Объект) Экспорт
 Перем МетаданныеОбъекта;
 
 Если НЕ Объект.Ссылка.Пустая() Тогда
  
  МетаданныеОбъекта = Объект.Метаданные();
  
  СтрокаСобытие = "Данные.ИзменениеРеквизитов." + МетаданныеОбъекта.Имя;
  ПрежнийОбъект = Объект.Ссылка;
  РеквизитыПрежнегоОбъекта = ПолучитьРеквизитыОбъекта(ПрежнийОбъект);
  
  СтрокаСообщениеРеквизит = "Изменён реквизит ";
  СтрокаСообщениеТабЧасть = "Изменена таб.часть ";
  СтрокаСообщениеТабЧастьУдалено = "Удалено ";
  СтрокаСообщениеТабЧастьДобавлено = "Добавлено ";
  
  Для Каждого Элемент из РеквизитыПрежнегоОбъекта Цикл
   ПрежнийРеквизитЗначение = Элемент.Значение;
   НовыйРеквизитЗначение = Объект[Элемент.Ключ];
   Если ТипЗнч(НовыйРеквизитЗначение) = Тип("Строка") Тогда
    НовыйРеквизитЗначение = СокрЛП(НовыйРеквизитЗначение);
   КонецЕсли;
   Если ТипЗнч(ПрежнийРеквизитЗначение) = Тип("Строка") Тогда
    ПрежнийРеквизитЗначение = СокрЛП(ПрежнийРеквизитЗначение);
   КонецЕсли;
   Если ПрежнийРеквизитЗначение <> НовыйРеквизитЗначение Тогда
    ЗаписьЖурналаРегистрации(СтрокаСобытие, УровеньЖурналаРегистрации.Предупреждение, МетаданныеОбъекта, ПрежнийОбъект, СтрокаСообщениеРеквизит + Элемент.Ключ + Символы.ВК + "Прежний: " + Строка(ПрежнийРеквизитЗначение) + Символы.ВК + "Новый: " + Строка(НовыйРеквизитЗначение));
   КонецЕсли;
  КонецЦикла;
  
  Если МетаданныеОбъекта.ТабличныеЧасти.Количество() > 0 Тогда
   
   // Определяем список проверяемых реквизитов табличных частей,
   // чтобы не забивать журнал регистрации лишними записями.
   // Для каждой конфигурации определить свой список, либо удалить проверку
   // Здесь приведён пример для Управления Торговлей.
   ПроверяемыеРеквизитыТабЧасти = Новый Структура("Номенклатура, ЕдиницаИзмерения, Количество, Цена, Сумма, СтавкаНДС, СерияНоменклатуры, ХарактеристикаНоменклатуры, СерияНоменклатурыНовая, ХарактеристикаНоменклатурыНовая, СерияНоменклатурыСтарая, ХарактеристикаНоменклатурыСтарая, Проект, ЗаказПокупателя, Сделка, ДокументПартии, ДокументРасчетовСКонтрагентом, СуммаВзаиморасчетов, ДоговорКонтрагента, Контрагент, СтатьяДвиженияДенежныхСредств, ПроцентСкидкиНаценки, НаименованиеТовара, ЗаказПоставщику, ДокументПоступления, ДокументОснование, ИсходноеРазмещение, НовоеРазмещение, СуммаТовара, СуммаПлатежа, Размещение, УвеличениеДолгаКонтрагента, УменьшениеДолгаКонтрагента, КоличествоУчет, ДокументРезерва, ТипЦен, Валюта, Пользователь, ВидЗадолженности, ВидОперации");
   
   //This code is ported from http://www.kb.mista.ru/article.php?id=115
   Для Каждого МДТЧ ИЗ МетаданныеОбъекта.ТабличныеЧасти Цикл
    ИмяТЧ = МДТЧ.Имя;
    ТЧ1 = Объект[ИмяТЧ];
    ТЧ2 = ПрежнийОбъект[ИмяТЧ];
    ТЧ1Количество = ТЧ1.Количество();
    ТЧ2Количество = ТЧ2.Количество();
    Если ТЧ1Количество <> ТЧ2Количество Тогда
     ЗаписьЖурналаРегистрации(СтрокаСобытие, УровеньЖурналаРегистрации.Предупреждение, МетаданныеОбъекта, Объект.Ссылка, СтрокаСообщениеТабЧасть + ИмяТЧ + Символы.ВК + "Прежняя: " + Строка(ТЧ2Количество) + ". Новая: " + Строка(ТЧ1Количество));
    КонецЕсли;
    Если ТЧ1Количество = ТЧ2Количество Тогда
     СтрокаСообщение = СтрокаСообщениеРеквизит;
    ИначеЕсли ТЧ2Количество > ТЧ1Количество Тогда
     СтрокаСообщение = СтрокаСообщениеТабЧастьУдалено;
    ИначеЕсли ТЧ2Количество < ТЧ1Количество Тогда
     СтрокаСообщение = СтрокаСообщениеТабЧастьДобавлено;
    КонецЕсли;
    
    Для Инд = 0 По Макс(ТЧ1Количество - 1, ТЧ2Количество - 1) Цикл
     
     Для Каждого МДРТЧ ИЗ МДТЧ.Реквизиты Цикл
      Реквизит = МДРТЧ.Имя;
      
      // При необходимости проверку можно удалить
      Если НЕ ПроверяемыеРеквизитыТабЧасти.Свойство(Реквизит) Тогда
       Продолжить;
      КонецЕсли;
      
      Если Инд >= ТЧ1Количество Тогда
       НовыйРеквизитЗначение = Неопределено;
      Иначе
       НовыйРеквизитЗначение = ТЧ1[Инд][Реквизит];
      КонецЕсли;
      Если Инд >= ТЧ2Количество Тогда
       ПрежнийРеквизитЗначение = Неопределено;
      Иначе
       ПрежнийРеквизитЗначение = ТЧ2[Инд][Реквизит];
      КонецЕсли;
      
      Если (ЗначениеЗаполнено(ПрежнийРеквизитЗначение) И ЗначениеЗаполнено(НовыйРеквизитЗначение)) ИЛИ (НЕ ЗначениеЗаполнено(ПрежнийРеквизитЗначение) И ЗначениеЗаполнено(НовыйРеквизитЗначение)) ИЛИ (ЗначениеЗаполнено(ПрежнийРеквизитЗначение) И НЕ ЗначениеЗаполнено(НовыйРеквизитЗначение)) Тогда
       Если ТипЗнч(НовыйРеквизитЗначение) = Тип("Строка") Тогда
        НовыйРеквизитЗначение = СокрЛП(НовыйРеквизитЗначение);
       КонецЕсли;
       Если ТипЗнч(ПрежнийРеквизитЗначение) = Тип("Строка") Тогда
        ПрежнийРеквизитЗначение = СокрЛП(ПрежнийРеквизитЗначение);
       КонецЕсли;
       Если НовыйРеквизитЗначение <> ПрежнийРеквизитЗначение Тогда
        ЗаписьЖурналаРегистрации(СтрокаСобытие, УровеньЖурналаРегистрации.Предупреждение, МетаданныеОбъекта, Объект.Ссылка, СтрокаСообщение + ИмяТЧ + "." + Реквизит + " в строке " + (Инд + 1) + Символы.ВК + "Прежний: " + Строка(ПрежнийРеквизитЗначение) + Символы.ВК + "Новый: " + Строка(НовыйРеквизитЗначение));
       КонецЕсли;
      КонецЕсли;
      
     КонецЦикла;
    КонецЦикла;
   КонецЦикла;
  КонецЕсли;
  
 КонецЕсли;
 
КонецПроцедуры
К сожалению источник функции потерял.

Есть ли свойство 1С

// Универсальная функция для проверки наличия свойств у значения любого типа данных
// Переменные:
// 1. Переменная - переменная любого типа, для которой необходимо проверить наличие свойства
// 2. ИмяСвойства - переменная типа "Строка", содержащая искомое свойства
//
Функция СодержитСвойство(Переменная, ИмяСвойства) Экспорт // 14.10.2014 - Пермитин Ю.А.
     
    // Исключения. Эти типы не имеют свойств при проверке
    ТипПеременной = ТипЗнч(Переменная);
    Если ТипПеременной = Тип("Неопределено") ИЛИ ТипПеременной = Тип("Массив") Тогда
        Возврат Ложь;
    КонецЕсли;
     
    // Инициализируем структуру для теста с ключом (значение переменной "ИмяСвойства") и значением произвольного GUID'а
    GUIDПроверка = Новый УникальныйИдентификатор;
    СтруктураПроверка = Новый Структура;
    СтруктураПроверка.Вставить(ИмяСвойства, GUIDПроверка);
    // Заполняем созданную структуру из переданного значения переменной
    ЗаполнитьЗначенияСвойств(СтруктураПроверка, Переменная);
    // Если значение для свойства структуры осталось NULL, то искомое свойство не найдено, и наоборот.
    Если СтруктураПроверка[ИмяСвойства] = GUIDПроверка Тогда
        Возврат Ложь;
    Иначе
        Возврат Истина;
    КонецЕсли;
КонецФункции
Источник
 

CopyPaste Copyright © 2017 - |- Шаблон создан O Pregador - |- Отредактирован myr4ik07