9 сент. 2016 г.

Соединить три макета в одном

Процедура была взята с интернета.
Процедура КнопкаВыполнитьНажатие(Кнопка)
        таб1    = Новый ТабличныйДокумент;
        таб1.Вывести(ПолучитьМакет("Макет1"));
        таб1.Показать();

        таб2    = Новый ТабличныйДокумент;
        таб2.Вывести(ПолучитьМакет("Макет2"));
        таб2.Показать();

        таб     = Новый ТабличныйДокумент;
        выс     = Макс(таб1.ВысотаТаблицы, таб2.ВысотаТаблицы);
       
        обл     = ПолучитьМакет("Макет").ПолучитьОбласть("Область1|Область2");

        обл1= таб1.ПолучитьОбласть(1,1, выс, таб1.ШиринаТаблицы);
        обл2= таб2.ПолучитьОбласть(1,1, выс, таб2.ШиринаТаблицы);
       
        таб.Вывести(обл1);
        таб.Присоединить(обл);
        таб.Присоединить(обл2);
        таб.Показать();
КонецПроцедуры

Выполнить 1С

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

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

&НаСервере
Процедура Команда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" клиентами.

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

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

 

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