9 сент. 2016 г.

Посмотреть запрос динамического списка

&НаСервере
Процедура Команда1НаСервере()
       
        //Список - это динамический список на форме списка справочника
        Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
        Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
       
        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        Макет = КомпоновщикМакета.Выполнить(Схема,Настройки);
       
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
        //посмотреть запрос динамического списка
        Команда1НаСервере();
КонецПроцедуры
Ставим точку останова на Макет, а далее Макет.НаборыДанных.НаборДанныхДинамическогоСписка.Запрос
мы получим запрос, который выбирает данные для динамического списка

Разбить строку

Функция была взята с интернета.

// Функция "расщепляет" строку на подстроки, используя заданный 
//        разделитель. Разделитель может иметь любую длину. 
 
//        Если в качестве разделителя задан пробел, рядом стоящие пробелы 
 //        считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр
 
//        игнорируются.
 //        Например, 
 
//        РазложитьСтрокуВМассивПодстрок(",ку,,,му", ",") возвратит массив значений из пяти элементов, 
 //        три из которых - пустые строки, а 
 
//        РазложитьСтрокуВМассивПодстрок(" ку   му", " ") возвратит массив значений из двух элементов
 //
 
//    Параметры: 
 //        Стр -             строка, которую необходимо разложить на подстроки. 
 
//                        Параметр передается по значению.
 //        Разделитель -     строка-разделитель, по умолчанию - запятая.
 
//
 //
 
//    Возвращаемое значение:
 //        массив значений, элементы которого - подстроки
 
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
   
    МассивСтрок = Новый Массив();
    Если Разделитель = " " Тогда
        Стр = СокрЛП(Стр);
        Пока 1=1 Цикл
            Поз = Найти(Стр,Разделитель);
            Если Поз=0 Тогда
                МассивСтрок.Добавить(Стр);
                Возврат МассивСтрок;
            КонецЕсли;
            МассивСтрок.Добавить(Лев(Стр,Поз-1));
            Стр = СокрЛ(Сред(Стр,Поз));
        КонецЦикла;
    Иначе
        ДлинаРазделителя = СтрДлина(Разделитель);
        Пока 1=1 Цикл
            Поз = Найти(Стр,Разделитель);
            Если Поз=0 Тогда
                МассивСтрок.Добавить(Стр);
                Возврат МассивСтрок;
            КонецЕсли;
            МассивСтрок.Добавить(Лев(Стр,Поз-1));
            Стр = Сред(Стр,Поз+ДлинаРазделителя);
        КонецЦикла;
    КонецЕсли;
   
КонецФункции// глРазложить

Передать ТаблицаЗначений из Сервера на Клиент

В результате на клиенте получим не ТЗ, а Структура, если отправим в эту функцию ТЗ.
Функция была взята из интернета. 
Функция ТаблицаЗначенийВМассивСтруктур(ТЗ)

// Создаем список имен колонок
МассивИменКолонок = Новый Массив;
Для Каждого ТекКолонка Из ТЗ.Колонки Цикл
    МассивИменКолонок.Добавить(ТекКолонка.Имя);
КонецЦикла;

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

Возврат МассивСтруктур;

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

Проверить номенклатуру в иерархии

Процедура ВхождениеНоменклатурыВОднуИзГруппСписка(Номенклатура)

Выборка = Справочники.Группы.Выбрать();

 Пока Выборка.Следующий() Цикл

  Если Номенклатура.ПринадлежитЭлементу(Выборка.Группа) Тогда
            //Номенклатура входит в группу

 Иначе
           //Номенклатура не входит в группу
 КонецЕсли;

КонецЦикла
КонецПроцедуры

24 авг. 2016 г.

Создание узла РИБ плана обмена вручную

Надоело мне ждать пару часов пока создастся образ периферийной базы с центрального узла, да и не факт, что он создастся удачно, а не покажет многим знакомое окно «Не достаточно памяти».  К тому же, при создании РИБ база трудиться только над созданием образа, а значит периферийные узлы находятся без актуальных данных.

Вот способ, нашел его в сети способ, а также обработку, с помощью которого, буквально за 15 минут мы получим как минимум один рабочий образ узла РИБ.

В моем случаи есть ЦБ (Центральная база) и нужно создать образ для ПБ1 (периферийная база 1).
Конфигурация УТП для Украины 1.2. Файловый режим.
  • В ЦБ пункт меню -  Операции – Планы обмена – Полный – Создаю новый узел ПБ1
  • В ЦБ пункт меню - Сервис – Распределенные информационные базы (РИБ) – Настроить узлы РИБ – Добавляю настройку обмена с Узлом ПБ1
  • Беру файл базы данных 1Cv8.1CD нашей главной базы ЦБ и копирую его, например, в папку ПБ1 (папка ПБ1 естественно создаю так же)
  • Подключаю скопированную базу обычным способом, через запуск 1С Предприятие – Добавить – Добавление в список существующей информационной базы
  • Открываю скопированную базу ПБ1 и запускаю обработку СозданиеПодчиненногоУзла83.epf – устанавливаю галку «Очистить объекты, не участвующие в обмене -  выбираю ПБ1 узел – нажимаю «Создать образ подчиненного узла»
  • В ПБ1 пункт меню - Сервис - Сервис – Распределенные информационные базы (РИБ) – Настроить узлы РИБ – Добавляю настройку обмена с Узлом ЦБ
Все, подведем итог в «двух словах», что мы сделали, а мы сделали копию центральной базы, запустили в ней обработку, которая очистила нужные данные для того, чтобы созданная копия стала периферийной.

29 июл. 2016 г.

Не обязательное заполнение параметров в запросе 1С

Есть форма для отчёта. Отчёт будет формироваться с помощью ТабличныйДокумент + Макет.
На форме есть СписокЗначений (ОТК_Несоответствиядля заполнения пользователем параметров. Параметров может быть несколько или вовсе не быть.

При формировании Запроса нужно избежать ошибки "не заполнены параметры".

Я выхожу с данной ситуации вот так:
 Запрос = Новый Запрос;
 //заполнение не обязательных параметров запроса
 Текст_Список_ОТК_Несоответствия = "";
 Если Объект.ОТК_Несоответствия.Количество() <> 0 Тогда 
  Список_ОТК_Несоответствия = Новый Массив;
  Для Каждого Эл Из Объект.ОТК_Несоответствия Цикл 
   Список_ОТК_Несоответствия.Добавить(Эл.Значение);
  КонецЦикла;
  
  Текст_Список_ОТК_Несоответствия = " И ОтчетПроизводстваЗаСменуНесоответствия.Несоответствие В (&Несоответствие)";
  Запрос.УстановитьПараметр("Несоответствие",Список_ОТК_Несоответствия);
 КонецЕсли;
 //ЗАПРОС
 Запрос.Текст =  "ВЫБРАТЬ
 | ОтчетПроизводстваЗаСменуТовары.Ссылка.Ссылка КАК Ссылка,
 | ОтчетПроизводстваЗаСменуТовары.Номенклатура,
 | ОтчетПроизводстваЗаСменуГрафикРабот.Ссылка.Номер КАК ОПзС,
 | ОтчетПроизводстваЗаСменуГрафикРабот.Ссылка.Заказ.НомерЗаказаУТП КАК НомерЗаказа
 |ИЗ
 | Документ.ОтчетПроизводстваЗаСмену.ГрафикРабот КАК ОтчетПроизводстваЗаСменуГрафикРабот
 |  ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОтчетПроизводстваЗаСмену.Товары КАК ОтчетПроизводстваЗаСменуТовары
 |  ПО ОтчетПроизводстваЗаСменуГрафикРабот.Ссылка.Ссылка = ОтчетПроизводстваЗаСменуТовары.Ссылка.Ссылка
 |  ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОтчетПроизводстваЗаСмену.ПричиныОстановки КАК ОтчетПроизводстваЗаСменуПричиныОстановки
 |  ПО ОтчетПроизводстваЗаСменуГрафикРабот.Ссылка.Ссылка = ОтчетПроизводстваЗаСменуПричиныОстановки.Ссылка.Ссылка
 |  ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОтчетПроизводстваЗаСмену.Несоответствия КАК ОтчетПроизводстваЗаСменуНесоответствия
 |  ПО ОтчетПроизводстваЗаСменуГрафикРабот.Ссылка.Ссылка = ОтчетПроизводстваЗаСменуНесоответствия.Ссылка.Ссылка
 |ГДЕ
 | ОтчетПроизводстваЗаСменуГрафикРабот.Дата МЕЖДУ &ДатаНач И &ДатаКон
 | И ОтчетПроизводстваЗаСменуГрафикРабот.Операция = &Отгрузка" +Текст_Список_ОТК_Несоответствия+";

 //обязательные параметры запроса
 Запрос.УстановитьПараметр("ДатаКон", КонецДня(Объект.ДатаКонец));
 Запрос.УстановитьПараметр("ДатаНач", НачалоДня(Объект.ДатаНачало));
 Запрос.УстановитьПараметр("Отгрузка", Константы.ПроизводствоОперацияОтгрузка.Получить());
 //обязательные параметры запроса

 РезультатЗапроса = Запрос.Выполнить(); 

1 июл. 2016 г.

Обновляется поле ввода ПодключитьОбработчикОжидания

Нужно показывать на форме текущее время, что и делаю


пишу



но смысл в том, что есть (на скрине №1) поле ввода, в которое вручную нужно вводить значения и оно каждый раз обработчиком ожидания обновляет значения.

Что бы этого избежать нужно в свойствах элемента формы Поля ввода найти свойство ОбновлениеТекстаРедактирования  и установить значение "При изменении значения".

Но разработчики 1С такое не рекомендують делать, а значит, лучше всего будет выводить обработчиком ожидания какое то значение (в моем случае это время) в заголово формы


а выглядит это так


Все.

25 июн. 2016 г.

Добавить фото на форму 1С

Нужно было добавить возможность сохранять фотографии в справочнике Сотрудники.
Добавил в реквизит объекта реквизит «Фото» с типом «ХранилищеЗначений».
Добавил в реквизиты формы реквизит «СсылкаНаКартинку» с типом «Строка», с видом «ПолеКартинки».
Естественно, добавил кнопку «ВыбораФайла».

Теперь приведу два варианта решение задачи, так как первый вариант будет работать с платформой, у которой уже появился объект «ОписаниеОповещения», так как в 8.2 такого объекта еще нет.

Для тех, у кого в свойствах конфигурации отключен «Режим использования модальности» и использует версию платформы выше 8.2

*(данные способ был полностью скопирован в Павла Чистова)




Для тех, у кого в свойствах конфигурации включен «Режим использования модальности» и использует версию платформы ровную 8.2


17 июн. 2016 г.

Результат запроса в одну строку

Пример:

Документ, в нем табличная часть, в ней много значений.

Обычным результатом запроса получается вот такой итог

1

а мне нужно вот такой итог

3

для того, что бы добиться выше результата нужно в СКД на вкладке Ресурсы добавить требуемое для вывода в одну строку Поле и в Выражении применить такую функцию

2

СоединитьСтроки (), у меня вышло СоединитьСтроки (Причина,",",",").

Справку по функции можно найти через Конфигуратор – Справка - Поиск по справке - СоединитьСтроки

13 июн. 2016 г.

Не срабатывает внешнее событие 1С

Пустая конфигурация (Управляемые формы), создаю внешнюю обработку, хочу, что бы при считывании Считывателем магнтных карт (СМК) данные попадали в форму, но, при остановке события на процедуре Формы ВнешнееСобытие() остановка не происходит.
Толстый клиент Управляемое приложение

&НаКлиенте        
Перем ДемоКомп;

&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
        Сообщить(Данные);
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
        DevId = Неопределено;
        ПодключитьВнешнююКомпоненту("C:\ZR1C.dll", "Comp", ТипВнешнейКомпоненты.Native);
        ДемоКомп  = Новый("AddIn.Comp.ZR1CExtension");
        ДемоКомп.Порт = "Com3";                 
        ДемоКомп.Подключить(DevId);     
КонецПроцедуры
Толстый клиент Обычное приложение
//Создаем Реквизит объекта с типом Произвольный
Процедура КнопкаВыполнитьНажатие(Кнопка)
  DevId = Неопределено;
  ПодключитьВнешнююКомпоненту("C:\ZR1C.dll", "Comp", ТипВнешнейКомпоненты.Native);
 Реквизит1  = Новый("AddIn.Comp.ZR1CExtension");
        Реквизит1.Порт = "Com3";                        
        Реквизит1.Подключить(DevId);    
КонецПроцедуры

Процедура ВнешнееСобытие(Источник, Событие, Данные)
   Сообщить(Данные);
КонецПроцедуры
Выше был вариант подключения считывателя магнтных карт для самописной конфигурации, а вот ниже для этой же самописной конфигурации код подключения сканера штрих кода используя .dll компоненту от АТОЛ.
&НаКлиенте        
Перем ДемоКомп;

&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
 Сообщить(Данные);
КонецПроцедуры


&НаКлиенте
Процедура Команда1(Команда)
 Попытка
  ЗагрузитьВнешнююКомпоненту( "C:\Scaner1C.dll");  
  ДемоКомп = Новый("AddIn.Scaner45");
 Исключение
  Сообщить(ОписаниеОшибки());
 КонецПопытки;
КонецПроцедуры

24 мая 2016 г.

Добавить номер телефона в КонтактнаяИнформация Контрагента УТ 3.0

Что бы добавить программно свою запись номера телефона в табличную часть КонтактнаяИнформация справочника.Контрагенты нужно, сначала записать объект.контрагент, а потом получить этот же объект, добавить свою строку с номером телефона в табличную часть и еще раз записать отредактированный объект. Этим самым все прекрасно запишеться и не нужно лезть в дебри общиих модулей.
Весь код, выглядит так:
…………………………
НовыйНомерТелефона = “+380(11)-111-11-11”;
Контрагент.Записать();
КонтрагентОбъект = Контрагент.Ссылка.ПолучитьОбъект();
НовСтрока = КонтрагентОбъект.КонтактнаяИнформация.Добавить();
НовСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
НовСтрока.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонПартнера;
НовСтрока.Представление = НовыйНомерТелефона;
КонтрагентОбъект.ОбменДанными.Загрузка = Истина;
КонтрагентОбъект.Записать();

10 мая 2016 г.

Конфигурация "Спортзал"

!!!Конфигурация на украинском языке, но, если есть желание, переведу на любой интересующий.

Данное прикладное решение имеет всего 4 вида объектов, это:

  • 4 справочника (Абонемент (вид тренировки), Карта (ориентир скидок), Клиент (список клиентов)
  • 1 отчет (по данным отчета можно узнать информацию о клиенте (когда, сколько и какого вида занятия брал клиент, а также баланс, скидка и долг по конкретному занятию).

  • 1 регистр сведений (этим объектом реализовано сохранение и повторное использование одной и той же карточки клиента много раз, т.е., если срок действия абонемента закончился, то не надо создавать еще один элемент справочника для того самого клиента, ранее созданная карточка клиента может обновлять предыдущий вид абонемента).
  • 1 обработка (осуществляет поиск клиента по индивидуально выданной карте для каждого клиента.

Описание объектов:

Абонемент или вид тренировки дает возможность выбрать тренировку или количество занятий (например, клиент может купить 50 занятий и заниматься только с тренером, а может посещать занятие за период, с 10 по 20 число месяца апрель и хоть ночевать в тренажерном зале). Также в окне абонемента можно и нужно указать как название, так и стоимость абонемента.

В карте клиента можно создать вид карты (по данному справочнику можно делать ориентир, например, создать карту «Универсальная», которая выбирается для всех клиентов, а «Скидочная», которая только для выборочных клиентов)

Главное окно карты клиента:

В карточке клиента нужно:

  • Указать фотографию клиента
  • Задать № карты, которая индивидуально выдается для каждого клиента администратором зала при создании карточки клиента в программе
  • Указать Контактные данные, такие как:
    • Ф.И.О.
    • Дата рождения (если клиент не достиг 18 лет, тогда нужно добавить контактные данные родителей)
    • Номер телефона клиента
    • Адрес клиента
    • Если требуется, можно задать скидку клиенту (*скидка задается в валюте, а не в %)
    • Для информации можно задать начальный вес клиента (до занятий)
    • Абонемент
    • Карта

Порядок работы с созданием карточки клиента:

  • Заполняем № карты и выдаем карту клиенту (например, пластиковую карту с набитым индивидуальным штрих-кодом или номером для каждого клиента)
  • Заполняем Ф.И.О.
  • Д\Р и если нужно информацию о родителях
  • Номер телефона
  • Адрес
  • Начальный вес
  • Выбираем абонемент (при изменении поля абонемент автоматически стоимость абонемента записывается в долг клиенту и показывается в информативном окне по центру карточки клиента, а также в зависимости от вида абонемента будет показано или первоначальное количество дней, выбранных клиентом из абонемента или дата начала и дата окончания, то есть период оплаченных тренировок).

                Если, в типе абонемента стоит «Посещение» тогда при каждом приходе клиента на занятие, администратор зала должен открыть карточку клиента и нажать кнопку «Отчислить тренировку» где должен ввести (или просканировать, используя сканер штрих-кодов, штрих-код карты) № карты клиента

                и если, № карты будет соответствовать карте клиенту то будет списано - 1 занятие.

                Если, в типе абонемента стоит «Срок», тогда при каждом открытии карточки клиента будет показано, сколько дней еще осталось до конца оплаченного периода занятий по абонементу.

  • Нужно заполнить поле Карта, которая в функционале не играет роли, а просто информативно отображает, к какой категории относится данный клиент («скидочный», «универсальный», например).
  • Заполнить скидку (скидка заполняется в валюте, например, клиенту даем скидку на 10 грн.)
  • Нажимаем «Изменить данные» (После нажатия происходит пересчет Стоимость абонемента – Скидка, например, 2500 – 10 = 2490 – это является долгом клиента, который он должен оплатить. 
  • Этот долг помещается в информативное поле + в это же поле помещается информация о скидке. А также, в зависимости от типа абонемента, в моем случае тип (вид) «Посещение», а значит, первоначальное количество посещений переместилось в карточку клиента для дальнейшего информационного указание о выборе дней по данному абонементу. Так же, автоматически рассчитывается остаток дней тренировок + активируется кнопка «Внести средства», если клиент «созрел» оплатить выбранный абонемент.
  • Кнопка «Внести средства», во-первых, показывает информацию о текущем балансе клиента, да, клиент может «дать» администратору зала деньги, которые будут находиться на его виртуальном счете, во-вторых в данной форме есть возможность оплатить как наличными за выбранный абонемент, так и балансом.

                Мы видим, что клиент наличными оплачивает администратору зала 3000 грн., а стоимость абонемента 2490, тогда разница в 510 грн. попадет клиенту на баланс.

                И в последующем балансовые 510 грн. клиент может оплатить за следующий абонемент.

                На этом создание и оплата клиентом выбранного абонемента окончена. Можно нажимать ЗаписатьИЗакрыть.

Порядок работы с продлением абонемента:

После окончания абонемента, нужно или перевыбрать существующий абонемент или выбрать новый, этим самым будет перестроено долг клиента, но данные еще не будут сохранены, а значит, в любой момент можем отказаться от изменений, закрыв карточку клиента, не соглашаясь на сохранение данных.

После изменения абонемента опять же, если нужно, указать скидку, а потом нажать кнопку «Изменить данные», этим самым «ПЕРЕЗАПИСЫВАЕМ» текущие данные на форме карточки клиента на новые данные по скидке, долгу, количеству дней или периоду посещения по абонементу.

! Бывает, что при создании карточки клиента, клиент не готов сразу оплатить выбранный абонемент, тогда создаем, описанным выше способом карточку клиента и тем самым по клиенту образуется долг и если клиент в будущем «созреет» оплатить свой долг тогда, как в карточке клиента, так и на форме отчета «Клиенты» есть кнопка «Корректировка долга»

после нажатия которой откроется список записей, где нужно отыскать запись (запись – это один цикл выбранного абонемента), по которой клиент хочет оплатить долг (ведь может быть, клиент задолжал еще и по предыдущему выбранному абонементу), открыть запись и в поле «Долг»

вписать результирующий долг после оплаты (например, осталось оплатить 100 грн., тогда в поле «Долг» пишем 100 грн).


Основные формы задокументированы нажатие F1

Тестировалось на релизе платформы 1С:Предприятие 8.3 (8.3.7.2008).

Только управляемые формы.

Конфигурация работает под «Толстый, Тонким, Web" клиентами.

Работает как локально, по сети, так и через интернет, используя веб-браузер.

Скачать конфигурацию можете по этой ссылке.

6 мар. 2016 г.

Обработка Новая почта

Замечание! Обработка работает только под «Толстым клиентом».
*Обновлено 20.04.2016 - теперь работает как под «Толстым клиентом» так и под «Тонким клиентом».

Реализованы некие функции создания электронной накладной, а именно, создания накладной типа «Склад-Склад», с формой оплаты «Наличные», с типом груза «Груз», с плательщиком «Отправитель\Получатель» и типом контрагента «Частное лицо».
Реализовано создание получателя с типом контрагента «Частное лицо».
Реализовано возможность получения на дату списка электронных накладных с возможностью печати этих накладных.

Ниже пару скриншотов:










Порядок работы с обработкой такой:

Заходим на https://my.novaposhta.ua, вводим логин и пароль, переходим в «Настройки», с левой стороны выбираем «API 2.0», создаем ключ, если он не создан, внизу среди списка ключей берем и копируем этот «Ключ» и вставляем в обработку. 

Теперь все кнопки и поля будут автоматически подгружать информацию из сервиса «Новой почты», узнавая вас по ключу.

Скачать обработку можем по этому адресу, а если у вас нет стартмани то пишите в комментариях, поделюсь бесплатно отправив по эл. почте.

19 февр. 2016 г.

ФИФО в запросе

Оказывается метод списания ФИФО можно получить перебирая запросом только Документы, а не городить все это дело через РегистрыНакопления, вот нашел, где то на инфостарте (спасибо автору)
ВЫБРАТЬ
ВложенныйЗапрос.Ссылка,
ВложенныйЗапрос.СуммаДокумента,
ВЫБОР
  КОГДА ВложенныйЗапрос.СуммаДокументаИтог <= &Оплата
   ТОГДА ВложенныйЗапрос.СуммаДокумента
  ИНАЧЕ ВложенныйЗапрос.СуммаДокумента + &Оплата - ВложенныйЗапрос.СуммаДокументаИтог
КОНЕЦ КАК Оплата
ИЗ
(ВЫБРАТЬ
  РасходнаяНакладная.Ссылка КАК Ссылка,
  РасходнаяНакладная.СуммаДокумента КАК СуммаДокумента,
  СУММА(РасходнаяНакладная1.СуммаДокумента) КАК СуммаДокументаИтог
ИЗ
  Документ.РасходнаяНакладная КАК РасходнаяНакладная
   ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная КАК РасходнаяНакладная1
   ПО РасходнаяНакладная.МоментВремени >= РасходнаяНакладная1.МоментВремени
СГРУППИРОВАТЬ ПО
  РасходнаяНакладная.Ссылка,
  РасходнаяНакладная.СуммаДокумента) КАК ВложенныйЗапрос
ГДЕ
ВложенныйЗапрос.СуммаДокументаИтог - ВложенныйЗапрос.СуммаДокумента < &Оплата
УПОРЯДОЧИТЬ ПО
ВложенныйЗапрос.Ссылка.МоментВремени

Получить дату и время из строки

Типовая каша показывает как получить из “2016.19.02” и “23:03:00” значения Типа Дата, а именно 2016.19.02 23:03:00
ДокументОбъект.Дата = ПолучитьДатуВремяИзСтроки(ДокументXDTO.Дата, ВремяСтрока);
Функция ПолучитьДатуВремяИзСтроки(ДатаСтрока, ВремяСтрока = "")
ДатаВремя = Дата(1,1,1);
Попытка
Если ТипЗнч(ДатаСтрока) = Тип("Дата")
И ТипЗнч(ВремяСтрока) = Тип("Дата") Тогда
ДатаВремя = Дата(Формат(ДатаСтрока, "ДФ=dd.MM.yyyy") + " " + Формат(ВремяСтрока, "ДЛФ=T"));
КонецЕсли;
Если ДатаВремя = Дата(1,1,1) Тогда
Если ЗначениеЗаполнено(ВремяСтрока) Тогда
Время = СтрЗаменить(ВремяСтрока, ":", "");
ДатаВремя = Дата(СтрЗаменить(ДатаСтрока, "-", "") + Время);
Иначе
ДатаВремя = Дата(СтрЗаменить(ДатаСтрока, "-", "") + "000000");
КонецЕсли;
КонецЕсли;
Исключение
КонецПопытки;
Возврат ДатаВремя;
КонецФункции

Срез последних с физической таблицы регистра сведений

Создали не периодический регистр сведений и в одной из задач нужно все же получить .СрезПоследних() из этого регистра запросом?
Вот пример получения
ВЫБРАТЬ
ВложенныйЗапрос.Период,
ВложенныйЗапрос.Номенклатура,
ЦеныНоменклатуры.Цена
ИЗ
(ВЫБРАТЬ
МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период,
ЦеныНоменклатуры.Номенклатура КАК Номенклатура
ИЗ
РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
СГРУППИРОВАТЬ ПО
ЦеныНоменклатуры.Номенклатура) КАК ВложенныйЗапрос
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ПО ВложенныйЗапрос.Период = ЦеныНоменклатуры.Период
И ВложенныйЗапрос.Номенклатура = ЦеныНоменклатуры.Номенклатура

Удалить элемент дерева значений

Есть реквизит формы ДеревоЗначений соответственно оно отображено и на форме как Элементы.Дерево, есть так же ТабличныйДокумент на форме в который из Дерево перемещаются элементы дерева.
Документ1
Товар1
Товар2
Документ2
Товар1
Товар2
Товар3
задача при перетаскивании Элементов из дерева (Товар1, Товар2 и т.д.), что бы эти элементы удалялись из дерева.
Выполняем
Если Элементы.Дерево.ТекущиеДанные=Неопределено Тогда
                    Возврат;
КонецЕсли;
ЭлементыТекущегоУровняИерархии=?(Элементы.Дерево.ТекущиеДанные.ПолучитьРодителя()=Неопределено, 
ДеревоОтгрузка.ПолучитьЭлементы(), Элементы.Дерево.ТекущиеДанные.ПолучитьРодителя().ПолучитьЭлементы());
 
ТекИндекс=0;
 
Пока ЭлементыТекущегоУровняИерархии[ТекИндекс]<>Элементы.Дерево.ТекущиеДанные Цикл
ТекИндекс=ТекИндекс+1;
КонецЦикла;

ЭлементыТекущегоУровняИерархии.Удалить(ТекИндекс);

Сообщение пользователю 1С

Понадобилось при разработке управляемой формы уведомить пользователя не только сообщением о ошибке, а и указать на поле где содержит ошибка? Для этих целей подойдет объект СообщениеПользователю.
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Обрати внимание!";
если на клиенте
Сообщение.Поле = "Объект.Контрагент";
Сообщение.Сообщить();
или
Сообщение.Поле = "Контрагент";
Сообщение.ПутьКДанным= "Объект";
Сообщение.Сообщить();
если на сервере
Сообщение.Поле = "Контрагент";
Сообщение.УстановитьДанные(РеквизитФормыВЗначение("Объект"));
Сообщение.Сообщить();
или
Сообщение.Поле = "Контрагент";
Сообщение.ПутьКДанным = "Объект"; // нюанс в том, что на сервере очень часто не известно, что такое "Объект" поэтому лучше использовать .УстановитьДанные()
Сообщение.Сообщить();
А вот пример где нужно указать на поле в Табличной части
Объект.Запасы – Табличная часть
Номенклатура – поле, на которое хочу установить активность
Индекс  - в данном случаи нужно обращаться по индексу, а не по Номеру строки
Для Каждого Строка Из Объект.Запасы Цикл 
  Сообщение = Новый СообщениеПользователю;
   Индекс = Объект.Запасы.Индекс(Строка);
   Сообщение.Текст = "Пользователь, обрати внимание "+Строка.Номенклатура+" на это поле";
   Сообщение.Поле = "Объект.Запасы["+Индекс+"-1].Номенклатура";
   Сообщение.Сообщить();
КонецЦикла;

9 февр. 2016 г.

Программное удаление реквизитов и элементов формы

Например, есть на управляемой форме программно добавленные реквизиты и соответственно элементы формы (колонки). Программным методотом нужно эти реквизиты и элементы формы удалить.
УдаляемыеРеквизитыТЗ = Новый Массив;
ТЗ = СтрокиРабочийТабель.Выгрузить();  // СтрокиРабочийТабель – это ТаблицаЗначений на форме
УдаляемыеРеквизитыТЗ.Добавить(СтрокиРабочийТабель.Линия1);  // добавляемв массив сначала реквизиты, который нужно удалить
Элементы.Удалить(Элементы[Линия1]);  // теперь добавляем в массив элементы формы, которые нужно удалить
ЭтаФорма.ИзменитьРеквизиты(, УдаляемыеРеквизитыТЗ);  //  непосредственное удаление реквизитов с помощью метода управляемой формы
 

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