Все записи автора prog

Пустая дата в 1C 7.7 и 1C 8.x

В версии 1с 7.7 проверку на пустую дату можно было делать так

Если Число(НашаДата) = 0 Тогда

.....

КонецЕсли



В версии 1с 8.x немного сложнее



Чаще всего используют вот такой вариант:


Если НашаДата = Дата("00010101") Тогда

Сообщить("Это пустая дата");

КонецЕсли;


можно подствлять такие варианты:

Дата(1, 1, 1), Дата("00010101000000"), Дата("0001-01-01")

Более подробная информация: manual1c.ru

Смотрите также:
Как выбрать файл в 1с:8.1: диалог выбора файла с примером

Как прочитать текстовый файл большого объема

Пустая дата в 1C 7.7 и 1C 8.x

В версии 1с 7.7 проверку на пустую дату можно было делать так

Если Число(НашаДата) = 0 Тогда

.....

КонецЕсли



В версии 1с 8.x немного сложнее



Чаще всего используют вот такой вариант:


Если НашаДата = Дата("00010101") Тогда

Сообщить("Это пустая дата");

КонецЕсли;


можно подствлять такие варианты:

Дата(1, 1, 1), Дата("00010101000000"), Дата("0001-01-01")

Более подробная информация: manual1c.ru

Смотрите также:
Как выбрать файл в 1с:8.1: диалог выбора файла с примером

Как прочитать текстовый файл большого объема

УПП 8.1. Взаимные блокировки.

Неделю назад, закончилась память на сервере с 1с 8 и он просто стал зависать. Решено было перейти с 32 битной системы, установленной  на сервере, на  64 бита (понятно, что 32 битная система ограничена 4gb объемом памяти). Сама база расположена на отдельном сервере под СУБД PostgreSQL , и удаленные пользователи работают через Citrix.
После установки 64 битного серевера  1с 8  начались дикие блокировки при проведении документов. Пользователей, работающих в базе не более 60-70 человек. Сама база около 4 Gb.

Перешли с   PostgreSQL на MS SQL 2005, так как  на PostgreSQL при транзакциях блокируется вся таблица, а MS SQL блокирует только строку в таблице (смотрим здесь).  Но проблема не исчезла.
Документы продолжают виснуть. Нельзя ни записать ни отменить проведение документа. Выскакивают сообщения об ошибках.


Иногда выскакивают сообщения с выходом на конкретную строку программного кода.

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

Нашли пример решения аналогичной  Проблемы, но не всё устраивает.

Так же здесь очень много полезного материала
А так же диски ИТС.

Сегодня пригласили Эксперта по технологическим вопросам.

УПП 8.1. Взаимные блокировки.

Неделю назад, закончилась память на сервере с 1с 8 и он просто стал зависать. Решено было перейти с 32 битной системы, установленной  на сервере, на  64 бита (понятно, что 32 битная система ограничена 4gb объемом памяти). Сама база расположена на отдельном сервере под СУБД PostgreSQL , и удаленные пользователи работают через Citrix.
После установки 64 битного серевера  1с 8  начались дикие блокировки при проведении документов. Пользователей, работающих в базе не более 60-70 человек. Сама база около 4 Gb.

Перешли с   PostgreSQL на MS SQL 2005, так как  на PostgreSQL при транзакциях блокируется вся таблица, а MS SQL блокирует только строку в таблице (смотрим здесь).  Но проблема не исчезла.
Документы продолжают виснуть. Нельзя ни записать ни отменить проведение документа. Выскакивают сообщения об ошибках.


Иногда выскакивают сообщения с выходом на конкретную строку программного кода.

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

Нашли пример решения аналогичной  Проблемы, но не всё устраивает.

Так же здесь очень много полезного материала
А так же диски ИТС.

Сегодня пригласили Эксперта по технологическим вопросам.

Склонения объектов в 1с 8.1. конфигурации УПП

Мысли на тему: Склонения объектов в конфигурации Управление производственным предприятем 8.1. Использование запросов для получения склонений.


В базе должен быть РегистрСведений.СклонениеОбъектов

Функция ЗапросСклоненияОбъекта(Объект,Падеж) 

    // задается Объект и Падеж (Перечисления.Падежи)

        Запрос = Новый Запрос;

        Запрос.Текст = "ВЫБРАТЬ
        |    СклонениеОбъектов.Объект,
        |    СклонениеОбъектов.Падеж,
        |    СклонениеОбъектов.Значение
        |ИЗ
        |    РегистрСведений.СклонениеОбъектов КАК СклонениеОбъектов
        |ГДЕ
        |(СклонениеОбъектов.Падеж = &Падеж)
        |И (СклонениеОбъектов.Объект = &ТекОбъект)";

        Запрос.УстановитьПараметр("Падеж", Падеж);
        Запрос.УстановитьПараметр("ТекОбъект",Объект);
    Возврат Запрос.Выполнить();

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



 Функция УстановитьПадеж(Сотрудник)
       Запрос = Новый Запрос;  //  Выбираются склонения должностей и физ. лиц

        Запрос.УстановитьПараметр("Падеж", Сотрудник.Падеж);
        Запрос.УстановитьПараметр("Должность", Сотрудник.Должность);
        Запрос.УстановитьПараметр("ФизическоеЛицо", Сотрудник.ФизЛицо);

        Запрос.Текст = "ВЫБРАТЬ
        |    СклонениеОбъектов.Объект,
        |    СклонениеОбъектов.Падеж,
        |    СклонениеОбъектов.Значение
        |ИЗ
        |    РегистрСведений.СклонениеОбъектов КАК СклонениеОбъектов
        |ГДЕ
        |СклонениеОбъектов.Падеж = &Падеж
        |И (СклонениеОбъектов.Объект = &Должность
        |ИЛИ СклонениеОбъектов.Объект = &ФизическоеЛицо)";

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


       Для каждого Строка Из Результат Цикл
           Если Строка.Объект = Сотрудник.Должность Тогда

                    Сотрудник.ДолжностьВПадеже   = Строка.Значение;

            КонецЕсли;

           Если Строка.Объект = Сотрудник.ФизЛицо Тогда
                   Сотрудник.ФИОВПадеже   = Строка.Значение;
            КонецЕсли;
        КонецЦикла;

     Возврат Неопределено;
 КонецФункции



В функцию УстановитьПадеж(Сотрудник) Передается Структура. Выглядить она таким образом:


Сотрудник = Новый Структура();


Для Каждого ТекСтрока Из РаботникиОрганизации Цикл

Сотрудник.Вставить("ФизЛицо",ТекСтрока.ФизЛицо);        
Сотрудник.Вставить("Падеж", Перечисления.Падежи.Дательный);
Сотрудник.Вставить("Должность", ТекСтрока.Должность);
Сотрудник.Вставить("ДолжностьВПадеже",ТекСтрока.Должность.Наименование);
Сотрудник.Вставить("ФИОВПадеже",ТекСтрока.ФизЛицо.Наименование);


КонецЦикла;

Склонения объектов в 1с 8.1. конфигурации УПП

Мысли на тему: Склонения объектов в конфигурации Управление производственным предприятем 8.1. Использование запросов для получения склонений.


В базе должен быть РегистрСведений.СклонениеОбъектов

Функция ЗапросСклоненияОбъекта(Объект,Падеж) 

    // задается Объект и Падеж (Перечисления.Падежи)

        Запрос = Новый Запрос;

        Запрос.Текст = "ВЫБРАТЬ
        |    СклонениеОбъектов.Объект,
        |    СклонениеОбъектов.Падеж,
        |    СклонениеОбъектов.Значение
        |ИЗ
        |    РегистрСведений.СклонениеОбъектов КАК СклонениеОбъектов
        |ГДЕ
        |(СклонениеОбъектов.Падеж = &Падеж)
        |И (СклонениеОбъектов.Объект = &ТекОбъект)";

        Запрос.УстановитьПараметр("Падеж", Падеж);
        Запрос.УстановитьПараметр("ТекОбъект",Объект);
    Возврат Запрос.Выполнить();

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



 Функция УстановитьПадеж(Сотрудник)
       Запрос = Новый Запрос;  //  Выбираются склонения должностей и физ. лиц

        Запрос.УстановитьПараметр("Падеж", Сотрудник.Падеж);
        Запрос.УстановитьПараметр("Должность", Сотрудник.Должность);
        Запрос.УстановитьПараметр("ФизическоеЛицо", Сотрудник.ФизЛицо);

        Запрос.Текст = "ВЫБРАТЬ
        |    СклонениеОбъектов.Объект,
        |    СклонениеОбъектов.Падеж,
        |    СклонениеОбъектов.Значение
        |ИЗ
        |    РегистрСведений.СклонениеОбъектов КАК СклонениеОбъектов
        |ГДЕ
        |СклонениеОбъектов.Падеж = &Падеж
        |И (СклонениеОбъектов.Объект = &Должность
        |ИЛИ СклонениеОбъектов.Объект = &ФизическоеЛицо)";

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


       Для каждого Строка Из Результат Цикл
           Если Строка.Объект = Сотрудник.Должность Тогда

                    Сотрудник.ДолжностьВПадеже   = Строка.Значение;

            КонецЕсли;

           Если Строка.Объект = Сотрудник.ФизЛицо Тогда
                   Сотрудник.ФИОВПадеже   = Строка.Значение;
            КонецЕсли;
        КонецЦикла;

     Возврат Неопределено;
 КонецФункции



В функцию УстановитьПадеж(Сотрудник) Передается Структура. Выглядить она таким образом:


Сотрудник = Новый Структура();


Для Каждого ТекСтрока Из РаботникиОрганизации Цикл

Сотрудник.Вставить("ФизЛицо",ТекСтрока.ФизЛицо);        
Сотрудник.Вставить("Падеж", Перечисления.Падежи.Дательный);
Сотрудник.Вставить("Должность", ТекСтрока.Должность);
Сотрудник.Вставить("ДолжностьВПадеже",ТекСтрока.Должность.Наименование);
Сотрудник.Вставить("ФИОВПадеже",ТекСтрока.ФизЛицо.Наименование);


КонецЦикла;

Выбрать элемент справочника в v 7.7 и в 8.1


Поговорим об интерактивном выборе элемента из справочника в версиях 7.7 и 8.1



В Версии 7.7 выбрать элемент справочника можно функцией Выбрать:

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



ОсновнаяФорма - можно выбрать


Для версии 8.1 выбор элемента может выглядеть так:

Спр=Справочники.Товары;
ФормаВыбора=Спр.ПолучитьФормуВыбора("ФормаВыбора");
ФормаВыбора.ЗакрыватьПриВыборе=Истина;
ФормаВыб.РежимВыбора = Истина;
 
ФормаВыбора.ОткрытьМодально();


Аналогичным образом можно выбирать и документы

Рабочая версия выглядит так:

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


 
Второй параметр в функции  ПолучитьФормуВыбора("ФормаВыбора",ЭтаФорма) - задает форму владелеца (ЭтаФорма) (подробнее описание функции смотрите в справке )

Была ситуация в версии 8.1, когда при выборе элемента из списка - элемент не выбирался, а происходило открытие для редактирования.
Проблема оказалась в коде выбираемого документа. Там был код принудительного открытия формы документа при выборе из списка:

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

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

пришлось добавить условие: если существует форма владелец, то производить выбор. В результате получилось так:

Процедура ДокументСписокВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)

    Если ЭтаФорма.ВладелецФормы = Неопределено Тогда      //Добавлено условие - в случае, если Форма-Владелей не определена

        Если ТекЗначениеУчета.Значение=Перечисления.ВидУчетаЛБ.Соптовары Тогда

            СтандартнаяОбработка = Ложь;

            ФормаСпецификации = ВыбраннаяСтрока.ПолучитьФорму("ФормаДокументаРозничнаяЛБ");

            ФормаСпецификации.Открыть();

        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Ещё можно глянуть более подробный материал здесь 

Выбрать элемент справочника в v 7.7 и в 8.1


Поговорим об интерактивном выборе элемента из справочника в версиях 7.7 и 8.1



В Версии 7.7 выбрать элемент справочника можно функцией Выбрать:

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



ОсновнаяФорма - можно выбрать


Для версии 8.1 выбор элемента может выглядеть так:

Спр=Справочники.Товары;
ФормаВыбора=Спр.ПолучитьФормуВыбора("ФормаВыбора");
ФормаВыбора.ЗакрыватьПриВыборе=Истина;
ФормаВыб.РежимВыбора = Истина;
 
ФормаВыбора.ОткрытьМодально();


Аналогичным образом можно выбирать и документы

Рабочая версия выглядит так:

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


 
Второй параметр в функции  ПолучитьФормуВыбора("ФормаВыбора",ЭтаФорма) - задает форму владелеца (ЭтаФорма) (подробнее описание функции смотрите в справке )

Была ситуация в версии 8.1, когда при выборе элемента из списка - элемент не выбирался, а происходило открытие для редактирования.
Проблема оказалась в коде выбираемого документа. Там был код принудительного открытия формы документа при выборе из списка:

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

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

пришлось добавить условие: если существует форма владелец, то производить выбор. В результате получилось так:

Процедура ДокументСписокВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)

    Если ЭтаФорма.ВладелецФормы = Неопределено Тогда      //Добавлено условие - в случае, если Форма-Владелей не определена

        Если ТекЗначениеУчета.Значение=Перечисления.ВидУчетаЛБ.Соптовары Тогда

            СтандартнаяОбработка = Ложь;

            ФормаСпецификации = ВыбраннаяСтрока.ПолучитьФорму("ФормаДокументаРозничнаяЛБ");

            ФормаСпецификации.Открыть();

        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Ещё можно глянуть более подробный материал здесь 

Как программно добавить кнопку в Панель формы 1с 8.1

Иногда бывает, что нужно вставить кнопку в форму программно. Как это можно реализовать в 1с 8.х

Мы хотим на Панель ОсновныеДействияФормы поместить новую кнопку

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)

Если ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Найти("ИмяКнопки")=Неопределено Тогда // проверяем: есть ли уже такая кнопка?

ТипКнопки = ТипКнопкиКоманднойПанели.Действие;
ДействиеКнопки = Новый Действие("ОсновныеДействияФормыНазваниеИмяКнопки");

КнопкиФормы =ЭлементыФормы.ОсновныеДействияФормы.Кнопки;
НоваяКнопка =КнопкиФормы.Добавить("ИмяКнопки",ТипКнопки,"Имя Кнопки",ДействиеКнопки);
НоваяКнопка.Картинка = БиблиотекаКартинок.ПиктограммаВашейКнопки;
НоваяКнопка.Отображение = ОтображениеКнопкиКоманднойПанели.Картинка; // можно выбрать другие варианты "Авто", "Надпись" или "Надпись и Картинка"
КнопкиФормы.Сдвинуть(НоваяКнопка,(-1)*КнопкиФормы.Количество()-1); // сдвигаем кнопку в крайнее правое положение
КонецЕсли;

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

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




Программно добавлена кнопка с изображением значка Word


Как программно добавить кнопку в Панель формы 1с 8.1

Иногда бывает, что нужно вставить кнопку в форму программно. Как это можно реализовать в 1с 8.х

Мы хотим на Панель ОсновныеДействияФормы поместить новую кнопку

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)

Если ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Найти("ИмяКнопки")=Неопределено Тогда // проверяем: есть ли уже такая кнопка?

ТипКнопки = ТипКнопкиКоманднойПанели.Действие;
ДействиеКнопки = Новый Действие("ОсновныеДействияФормыНазваниеИмяКнопки");

КнопкиФормы =ЭлементыФормы.ОсновныеДействияФормы.Кнопки;
НоваяКнопка =КнопкиФормы.Добавить("ИмяКнопки",ТипКнопки,"Имя Кнопки",ДействиеКнопки);
НоваяКнопка.Картинка = БиблиотекаКартинок.ПиктограммаВашейКнопки;
НоваяКнопка.Отображение = ОтображениеКнопкиКоманднойПанели.Картинка; // можно выбрать другие варианты "Авто", "Надпись" или "Надпись и Картинка"
КнопкиФормы.Сдвинуть(НоваяКнопка,(-1)*КнопкиФормы.Количество()-1); // сдвигаем кнопку в крайнее правое положение
КонецЕсли;

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

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




Программно добавлена кнопка с изображением значка Word