Можно ли немножко поучавствовать в проекте? - 1Cv7 ВСД в ГИС Меркурий - КБ99 Redmine

Проект

Общее

Профиль

Можно ли немножко поучавствовать в проекте?

Добавил(а) Алексей Диркс больше 6 лет назад

В некоторых случаях очень хочется подправить интерфейс. Немножко.
Например, в обработке ГО_Реализации спрятать колонки раскраски, и сделать автоширину таблички с документами.

Обработку взял последнюю, с гитхаба. Дата 25.06.18 16:00


Ответы (24)

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

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

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) Алексей Диркс больше 6 лет назад

В таком случае тем более привязки понадобятся. Могу класс предоставить.

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

Отлично, очень рады такой инициативе

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) Алексей Диркс больше 6 лет назад

Люблю, чтобы красиво было :)
а без привязок как-то не получается красиво.

Обратите внимание на содержимое Mercury.prm - я там с путями поигрался, чтобы класс МеркурийИнтеграция лежал в отдельной папке.
А то каждый раз при обновлении надо помнить, что его не затереть

чуть-чуть описания:
(вообще-то оно в .prm д.б., но почему-то ошибки полезли)


/// После создания экземпляра класса обязаельно д.б. вызван метод Инит()
///     оПривязки = СоздатьОбъект("Меркурий.Привязки");
///    оПривязки.Инит(Контекст);

///Для функционирования привязок в управляющий объект должны транслироваться следующие события FormEx
///  - ПослеОткрытия()
///  - ПриИзмененииРазмераОкна()

///Метод  Добавить(ИмяАтр, ...)
///<Описание>Привязывает атрибут формы к другим атрибутам. Параметры привязок должны передаваться после имени атрибута, и составлять пары (ТипПривязки, ИмяБазовогоАтрибута).
///Все привязки - это привязки края атрибута (верх, низ, лево, право) к краю другого атрибута. Вид привязки может задаваться как в виде строки, так и константой самого класса.
///Возможные виды привязок:
///  - ЛЛ (привЛево) - левый край к левому краю;
///  - ЛП (привЛевоКПраво) - левый край к правому;
///  - ПЛ (привПраво) - правый край к левому;
///  - ПП (привПравоКПраво) - правый край к правому;
///  - ВВ (привВерх) - верхний край к верхнему;
///  - ВН (привВерхКНизу) - верхний край к нижнему;
///  - НВ (привНиз) - нижний край к верхнему;
///  - НН (привНизКНизу) - нижний край к нижнему.
///В качестве базового атрибута (т.е. того, к которому осуществляется привязка) может использоваться любой атрибут формы, и сама форма.</Описание>
///<returns type = "Число">1 - атрибут добавлен в привязки, 0 - ошибка.</returns>

Пример инициализации

Перем оПривязки; //:Меркурий.Привязки

Процедура Привязки_Инит()
    оПривязки = СоздатьОбъект("Меркурий.Привязки");
    оПривязки.Инит(Контекст);

    оПривязки.Добавить("СписокДокументов, грпПартии, тзНеобходимыеПартии", "ПП", "Форма", "НН", "Форма");

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

Процедура ПриОткрытии()
    Привязки_Инит();
КонецПроцедуры

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) Алексей Диркс больше 6 лет назад

и ещё немаловажное замечание:
если в форме используются привязки, то лучше в свойствах формы выключить галку "Изменять размер", во избежание конкуренции

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

Начал проверять - у меня ругается в классе класс_Меркурий_Привязки.ert на НайтиСтрокуТЗ и Функция СтрокуВСписок(Стр)

Если НайтиСтрокуТЗ<<?>>(тзСплиттеры, "Идентификатор", итНастройки.Идентификатор) = 0 Тогда
{C:\1C\PRIOSKOL\COMPLEX\EXTFORMS\TEST\КЛАСС_МЕРКУРИЙ_ПРИВЯЗКИ.ERT(1024)}: Функция не обнаружена (НайтиСтрокуТЗ)

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) Алексей Диркс больше 6 лет назад

Как обычно, забыл проверить без ГМ.
Отправляю версию с этими методам в классе.

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

Спасибо, здорово!
закомитил https://github.com/phsin/vetrf
будем тестировать

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) Алексей Диркс больше 6 лет назад

По поводу ТП.

Зря вы функционал, относящийся к ТП, помещаете в глобалный модуль. Лучше сделать отдельный класс, унаследовав его от ТабличноеПоле.
Таким образом можно отрабатывать события в классе, и прикручивать туда общий функционал.

В приложенном примере создаётся иерархия из 2-х классов:
Меркурий.ТабличноеПоле : ТабличноеПоле
Меркурий.ТабличноеПоле.ТЗ : Меркурий.ТабличноеПоле

и пример их использования

Можете его использовать как есть, или в качестве примера. Ну или не использовать :)

Контекстное меню работать не будет, т.к. для него используется ещё один класс и ВК.
Для сохранения/восстановления настроек тоже надо что-то сделать, т.к. у нас этот функционал привязан к БД.
см. глПользователь.СохранитьНастройку(...) и глПользователь.СчитатьНастройку(...)

ТП.zip (32,1 КБ) ТП.zip

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) Алексей Диркс больше 6 лет назад

Ещё небольшая поправочка в ГМ::НайтиХозСубъект(ВыбКлиент)
когда создаём ХС, логично было бы попытаться заполнить ИНН и ОГРН

СпрХС.ИНН = ПолучитьИНН(ВыбКлиент);
СпрХС.ОГРН = ПолучитьОГРН(ВыбКлиент);

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) Алексей Диркс больше 6 лет назад

Ошибочка:
1) ГМ::ПолучитьТзРеализаций()

вместо

            |Left join 
            |    $Документ.ВСД_транзакция as ДокВСД
            |    ON SUBSTRING($ДокВСД.ДокОснование, 5, 8) = Жур.IDDoc

надо писать
            |Left join 
            |    $Документ.ВСД_транзакция as ДокВСД
            |    ON SUBSTRING($ДокВСД.ДокОснование, 5, 9) = Жур.IDDoc

т.к. длина IDDoc - 9 символов. Оно работало конечно, но лучше писать правильно

2) там же (ГМ::ПолучитьТзРеализаций())
вместо

   $ДокВСД.Статус <> 'Аннулирова'

надо писать
   IsNull($ДокВСД.Статус, '') <> 'Аннулирова'

т.к. если $ДокВСД не приджойнился, то результатом проверки будет Null, и реализации в результат не попадут

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

Алексей Диркс писал(а):

Ошибочка:
1) ГМ::ПолучитьТзРеализаций()

вместо
[...]
надо писать
[...]

т.к. длина IDDoc - 9 символов. Оно работало конечно, но лучше писать правильно

Почему вы так думаете?
структура таблиц следующая

2) там же (ГМ::ПолучитьТзРеализаций())
вместо
[...]
надо писать
[...]

т.к. если $ДокВСД не приджойнился, то результатом проверки будет Null, и реализации в результат не попадут

у меня выходят Реализации и с ВСД и без ВСД / с джойном и без джойна ...

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

другой вопрос как обойтись без вложенного запроса

            ТекстЗапроса = " 
            |SELECT
            |    Жур.IDDoc as [Док $Документ],
            |    Жур.IDDocDef as Док_вид,
            |    ДокВСД.IDDoc as [ДокВСД $Документ.ВСД_транзакция],
            |    Жур.DocNo as [НомерДок],
            |    $ДокР.Контрагент as [Контрагент $Справочник.Контрагенты],
            |    $ДокР."+ НазваниеРеквизитаГрузополучатель +" as [Грузополучатель $Справочник."+ ВидГрузополучателя +"],
            |    SUM($ДокСтроки."+ НазваниеРеквизитаКоличество +") [Количество],
            |    SUM($ДокСтроки."+ НазваниеРеквизитаКоличествоМест +") [КоличествоМест]
            |FROM
            |    _1SJourn Жур
            |INNER JOIN 
            |    $ДокументСтроки."+ НазваниеВидаДокументаРеализация +" as ДокСтроки 
            |        ON Жур.IDDoc = ДокСтроки.IDDoc
            |INNER JOIN 
            |    $Документ."+ НазваниеВидаДокументаРеализация +" as ДокР 
            |        ON Жур.IDDoc = ДокР.IDDoc
// очень некрасиво, но как убрать удаленные ВСД с минимальными потерями ?
// сейчас мы убираем только аннулированные 
            |    LEFT JOIN (SELECT ВСД.IDDOC as IDDOC
            |                    , SUBSTRING($ВСД.ДокОснование, 5, 8) as Реал
            |                FROM $Документ.ВСД_транзакция as ВСД
            |                    INNER JOIN _1SJourn Жур2 
            |                        ON Жур2.IDDoc = ВСД.IDDoc
            |                        AND Жур2.ismark = 0
            |                ) as ДокВСД ON ДокВСД.Реал = Жур.IDDoc
            |";
            Если ПропускатьПустыеСвойства =1 Тогда
                ТекстЗапроса=ТекстЗапроса+" 
                |    inner join $Справочник.Номенклатура as Ном 
                |        on $ДокСтроки.Номенклатура= Ном.ID
                |        and $Ном.ВСД_Продукция_Элемент <> $ПустойИД
                |";
            КонецЕсли;
            ТекстЗапроса=ТекстЗапроса+" 
            |WHERE
            |    Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
            |    Жур.IDDocDef = $ВидДокумента."+ НазваниеВидаДокументаРеализация +" 
            |    and Жур.Closed & 1 = 1
            |    and $ДокВСД.Статус <> 'Аннулирова'
            |";
            ТекстЗапроса=ТекстЗапроса+" 
            |    %УсловиеПоГрузополучателю%
            |    %УсловиеПоФирме%
            |
            |GROUP BY
            |    Жур.IDDoc,
            |    Жур.IDDocDef,
            |    Жур.DocNo,
            |    $ДокР.Контрагент,
            |    $ДокР."+ НазваниеРеквизитаГрузополучатель +",
            |    ДокВСД.IDDoc
            |
            |order by Жур.DocNo
            |";            

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) Алексей Диркс больше 6 лет назад

1) Описание таблиц для SQL можно посмотреть здесь http://www.script-coding.com/v77tables.html
п. 1.1.1. Хранение ID объекта

Этот формат используется во всех таблицах. В нашем случае ДокОснование - документ неопределенного вида - char(13)
а IdDoc - всегда char(9)
чтобы из char(13) получить char(9) надо либо Right(..., 9) либо Substring(..., 5, 9)

2) Поведение зависит от настроек (SET ANSI_NULLS ON/OFF)
MSDN: https://msdn.microsoft.com/ru-ru/library/ms188048(v=sql.120)
По умолчанию оно ON, а у вас судя по всему OFF.
У меня как раз без IsNull() выводятся только уже сформированные транзакции.
Лучше подстраховаться, чтобы не зависеть от настроек сервера.

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) Алексей Диркс больше 6 лет назад

Фильтр помеченных на удаление

|SELECT
|    Жур.IDDoc as [Док $Документ],
|    Жур.IDDocDef as Док_вид,
|    ДокВСД.IDDoc as [ДокВСД $Документ.ВСД_транзакция],
|    Жур.DocNo as [НомерДок],
|    $ДокР.Контрагент as [Контрагент $Справочник.Контрагенты],
|    $ДокР."+ НазваниеРеквизитаГрузополучатель +" as [Грузополучатель $Справочник."+ ВидГрузополучателя +"],
|    SUM($ДокСтроки."+ НазваниеРеквизитаКоличество +") [Количество],
|    SUM($ДокСтроки."+ НазваниеРеквизитаКоличествоМест +") [КоличествоМест]
|FROM
|    _1SJourn Жур
|    INNER JOIN $ДокументСтроки."+ НазваниеВидаДокументаРеализация +" as ДокСтроки ON Жур.IDDoc = ДокСтроки.IDDoc
|    INNER JOIN $Документ."+ НазваниеВидаДокументаРеализация +" as ДокР ON Жур.IDDoc = ДокР.IDDoc
|    Left join $Документ.ВСД_транзакция as ДокВСД ON SUBSTRING($ДокВСД.ДокОснование, 5, 9) = Жур.IDDoc
|
//    Джойн для журнала ВСД
|    LEFT JOIN _1SJourn жДокВСД With(NoLock) ON жДокВСД.IDDoc = ДокВСД.IDDoc
|";
Если ПропускатьПустыеСвойства =1 Тогда
    ТекстЗапроса=ТекстЗапроса+" 
    |    inner join $Справочник.Номенклатура as Ном 
    |        on $ДокСтроки.Номенклатура= Ном.ID
    |        and $Ном.ВСД_Продукция_Элемент <> $ПустойИД
    |";
КонецЕсли;
ТекстЗапроса=ТекстЗапроса+" 
|WHERE
|    Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
|    Жур.IDDocDef = $ВидДокумента."+ НазваниеВидаДокументаРеализация +" 
|    and Жур.Closed & 1 = 1
|    and IsNull($ДокВСД.Статус, '') <> 'Аннулирова'
|
//Фильтр помеченных на удаление
|    AND IsNull(жДокВСД.IsMark, -1) != 1

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) Алексей Диркс больше 6 лет назад

ой... что-то пошло не так :)

ТекстЗапроса = " 
|SELECT
|    Жур.IDDoc as [Док $Документ],
|    Жур.IDDocDef as Док_вид,
|    ДокВСД.IDDoc as [ДокВСД $Документ.ВСД_транзакция],
|    Жур.DocNo as [НомерДок],
|    $ДокР.Контрагент as [Контрагент $Справочник.Контрагенты],
|    $ДокР."+ НазваниеРеквизитаГрузополучатель +" as [Грузополучатель $Справочник."+ ВидГрузополучателя +"],
|    SUM($ДокСтроки."+ НазваниеРеквизитаКоличество +") [Количество],
|    SUM($ДокСтроки."+ НазваниеРеквизитаКоличествоМест +") [КоличествоМест]
|FROM
|    _1SJourn Жур
|    INNER JOIN $ДокументСтроки."+ НазваниеВидаДокументаРеализация +" as ДокСтроки ON Жур.IDDoc = ДокСтроки.IDDoc
|    INNER JOIN $Документ."+ НазваниеВидаДокументаРеализация +" as ДокР ON Жур.IDDoc = ДокР.IDDoc
|    Left join $Документ.ВСД_транзакция as ДокВСД ON SUBSTRING($ДокВСД.ДокОснование, 5, 9) = Жур.IDDoc
|
//    Джойн для журнала ВСД
|    LEFT JOIN _1SJourn жДокВСД With(NoLock) ON жДокВСД.IDDoc = ДокВСД.IDDoc
|";
Если ПропускатьПустыеСвойства =1 Тогда
    ТекстЗапроса=ТекстЗапроса+" 
    |    inner join $Справочник.Номенклатура as Ном 
    |        on $ДокСтроки.Номенклатура= Ном.ID
    |        and $Ном.ВСД_Продукция_Элемент <> $ПустойИД
    |";
КонецЕсли;
ТекстЗапроса=ТекстЗапроса+" 
|WHERE
|    Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
|    Жур.IDDocDef = $ВидДокумента."+ НазваниеВидаДокументаРеализация +" 
|    and Жур.Closed & 1 = 1
|    and IsNull($ДокВСД.Статус, '') <> 'Аннулирова'
|
//Фильтр помеченных на удаление
|    AND IsNull(жДокВСД.IsMark, -1) != 1

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) Алексей Диркс больше 6 лет назад

можно ещё по-другому условие написать, даже наверное более правильно

AND (
ДокВСД.sp10200 Is Null
OR ДокВСД.sp10200 != 'Аннулирова'
OR жДокВСД.IsMark != 1
)

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

всё же не работает - задваивает Реализации, если ВСД помечены на удаление
+на SQL2000 выдает ошибку

State 42000, native 156, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'WITH'.

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) Алексей Диркс больше 6 лет назад

тогда чёрт с ним, с NoLock'ом

джойн:
LEFT JOIN _1SJourn жДокВСД ON жДокВСД.IDDoc = ДокВСД.IDDoc

с условием я конечно напутал. Надо так:

|    AND (
|        $ДокВСД.Статус Is Null
|        OR (
|            $ДокВСД.Статус != 'Аннулирова'
|            AND жДокВСД.ISMark != 1
|        )
|    )

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) Владимир Сергей больше 6 лет назад

Обновился, теперь получаю:
оПривязки.Привязка("ТЗВСД", "H", "Форма", "W", "Форма"); {D:\BASE\DB\EXTFORMS\МЕРКУРИЙ_ГАШЕНИЕ_ВСД2.ERT}: Значение не представляет агрегатный объект (Привязка)
оПривязки.УстановитьФорму(Форма); {D:\BASE\DB\EXTFORMS\МЕРКУРИЙ_ГО_РЕАЛИЗАЦИИ_ТРАНЗАКЦИИ_2.ERT}: Значение не представляет агрегатный объект (УстановитьФорму)
оПривязки.Привязка("ВыбНоменклатура", "H", "Форма", "W", "Форма"); {D:\BASE\DB\EXTFORMS\ВСД_СОЗДАТЬПРОДУКЦИЯ_ЭЛЕМЕНТ.ERT}: Значение не представляет агрегатный объект (Привязка)

в defcls.prm добавил:
class Меркурий.Привязки = .\ExtForms\Меркурий\класс_Меркурий_Привязки.ert : РасширениеФормы {
void Привязка(Строка ИДЭлемента, Строка ТипВ="", Строка ИДЭлементаВ="", Строка ТипГ="", Строка ИДЭлементаГ="");
void УстановитьФорму(РасширяемаяФорма);
void ПриИзмененииРазмераОкна(ТипСобытия, ШиринаФормы, ВысотаФормы);
void ПослеОткрытия();
void Сбросить();
void Выровнять(ИДЭлемента, Граница, ИДЭлементаЦель, ГраницаЦель, Отступ);
void Привязать();
};

класс Меркурий.ТабличноеПоле = .\ExtForms\Меркурий\класс_Меркурий_ТабличноеПоле.ert : ТабличноеПоле {
};

класс Меркурий.ТабличноеПоле.ТЗ = .\ExtForms\Меркурий\класс_Меркурий_ТабличноеПоле_ТЗ.ert : Меркурий.ТабличноеПоле {
};

Что может быть не так?

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) Тувин Александр больше 6 лет назад

А что за классы Меркурий.ТабличноеПоле, Меркурий.ТабличноеПоле.ТЗ?
Может попробуем через anydesk связаться?

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) Владимир Сергей больше 6 лет назад

Писал вам в личку - тишина. Конечно, можно связаться, вопрос, как?

RE: Можно ли немножко поучавствовать в проекте? - Добавил(а) кб99 Синявский Филипп больше 6 лет назад

Ответил на ваше письмо.
связаться можно по телефону 8(846)2312339 или 8(846)2053080

    (1-24/24)